在Pandas DataFrame中合并列并按优先级覆盖值的技术问询
在大型Pandas DataFrame中按规则合并多列生成目标列
需求说明
保留col1的数值,当col2或col3存在有效值时,用对应列的数值覆盖col1,最终生成名为merged的目标列。
示例数据
import pandas as pd import numpy as np df1 = pd.DataFrame(data=[['1', 'A','nan','nan'], ['2', 'B','B1','nan'], ['3', 'C','C1','nan'], ['4', 'C','nan','C2'], ['5', 'D','D2','nan'], ['6', 'E','nan','E3'] ] , columns=['ObjectID', 'col1', 'col2','col3'])
解决方案
先将数据中的字符串'nan'转换为Pandas可识别的缺失值NaN,再通过矢量化操作高效生成目标列(避免循环,适配大型DataFrame):
步骤1:转换缺失值
df1 = df1.replace('nan', np.nan)
步骤2:生成merged列(两种高效方法可选)
方法一:使用bfill(axis=1)按行填充
通过指定列优先级,从右到左填充缺失值,取第一列结果:
# 优先级:col3 > col2 > col1,调整优先级只需修改列列表顺序 df1['merged'] = df1[['col3', 'col2', 'col1']].bfill(axis=1).iloc[:, 0]
方法二:使用combine_first链式覆盖
依次用高优先级列覆盖低优先级列的缺失值:
# 优先级:col2 > col3 > col1,调整优先级交换col2和col3位置即可 df1['merged'] = df1['col2'].combine_first(df1['col3']).combine_first(df1['col1'])
最终结果
执行代码后,df1将生成目标列merged,结果如下:
ObjectID col1 col2 col3 merged 0 1 A NaN NaN A 1 2 B B1 NaN B1 2 3 C C1 NaN C1 3 4 C NaN C2 C2 4 5 D D2 NaN D2 5 6 E NaN E3 E3
内容的提问来源于stack exchange,提问作者JMonk
相关产品推荐
相关产品推荐

