如何在Pandas中合并DataFrame的两列生成新列name3
合并DataFrame两列生成新列的解决方案
给定如下结构的DataFrame:
name1 name2 carl NaN NaN carl peter NaN NaN peter julia NaN NaN julia jenny jenny paul paul ...
需要生成新列name3,取值规则为:每行取非缺失的那个值;若两列均有值且相同,则直接取该值,最终得到如下结果:
name1 name2 name3 carl NaN carl NaN carl carl peter NaN peter NaN peter peter julia NaN julia NaN julia julia jenny jenny jenny paul paul paul ...
解决方法
方法1:使用combine_first
combine_first会优先保留第一列的非缺失值,当第一列为NaN时,用第二列的值填充,完美匹配需求:
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'name1': ['carl', None, 'peter', None, 'julia', None, 'jenny', 'paul'], 'name2': [None, 'carl', None, 'peter', None, 'julia', 'jenny', 'paul'] }) # 生成name3列 df['name3'] = df['name1'].combine_first(df['name2'])
方法2:使用fillna
逻辑与combine_first一致,用第二列的值填充第一列的NaN,结果相同:
df['name3'] = df['name1'].fillna(df['name2'])
方法3:使用行方向的填充函数
通过bfill或ffill按行填充缺失值,提取有效数据:
# 使用bfill向后填充,取每行第一个非NaN值 df['name3'] = df[['name1', 'name2']].bfill(axis=1).iloc[:, 0] # 或使用ffill向前填充,取每行最后一个非NaN值 df['name3'] = df[['name1', 'name2']].ffill(axis=1).iloc[:, 1]
最终结果
执行上述任意方法后,得到的DataFrame如下:
name1 name2 name3 0 carl NaN carl 1 NaN carl carl 2 peter NaN peter 3 NaN peter peter 4 julia NaN julia 5 NaN julia julia 6 jenny jenny jenny 7 paul paul paul
内容的提问来源于stack exchange,提问作者Olive
相关产品推荐
相关产品推荐

