如何将Pandas中的两列合并为一列?
解决Pandas合并互补列的问题
嘿,这个需求太常见啦!你的数据里B和C列是互补的(每行只有一列有值,另一列为NaN),咱们用Pandas的几种方法都能轻松合并成BC列,下面给你详细说:
1. 先还原你的原始数据
首先咱们先把你给出的DataFrame用代码复现出来,方便后续测试:
import pandas as pd import numpy as np df1 = pd.DataFrame({ 'A': [1, 2, 3, 4], 'B': [3, np.nan, 5, np.nan], 'C': [np.nan, 2, np.nan, 1] })
2. 方法一:用combine_first()(最直观的方法)
这个方法专门用来处理这种互补列的合并——优先保留左边列(B)的非空值,左边为空时用右边列(C)的值填补:
# 合并B和C为BC列 df1['BC'] = df1['B'].combine_first(df1['C']) # 如果不需要原来的B、C列,可以删掉 df1 = df1.drop(['B', 'C'], axis=1)
3. 方法二:用fillna()(逻辑简单易懂)
和上面的思路类似,直接用C列的值填充B列的NaN,然后赋值给新列:
df1['BC'] = df1['B'].fillna(df1['C']) df1 = df1.drop(['B', 'C'], axis=1)
4. 方法三:按行填充(适合多列合并场景)
如果以后你需要合并超过两列的互补数据,用bfill(axis=1)(按行向后填充)会更灵活:
# 选择B、C列,按行向后填充非空值,取第一列作为合并结果 df1['BC'] = df1[['B', 'C']].bfill(axis=1).iloc[:, 0] df1 = df1.drop(['B', 'C'], axis=1)
5. 可选:把BC列转为整数类型
上面的方法得到的BC列是浮点数(因为NaN是浮点类型),如果需要整数的话,可以加一句:
df1['BC'] = df1['BC'].astype(int)
最终结果
运行后你会得到期望的DataFrame:
A BC 0 1 3 1 2 2 2 3 5 3 4 1
内容的提问来源于stack exchange,提问作者Emad Alomari
相关产品推荐
相关产品推荐

