如何用Pandas从其他行匹配值替换DataFrame中的缺失值?
用匹配值替换Pandas DataFrame中的NaN
嘿,这个需求在数据清洗里太常见了,我给你几个针对性的方案,你可以根据自己的实际场景来选:
1. 基于关联列的分组填充(最常用场景)
如果你的两列是有对应关系的(比如一列是id,另一列是theme,同一个id对应的theme应该一致),那可以按关联列分组,用组内的非空值填充NaN:
# 假设你的DataFrame包含['id', 'theme']两列 # 按id分组,用组内的众数填充(若组内只有一个非空值,直接用该值) themes['theme'] = themes.groupby('id')['theme'].transform(lambda x: x.fillna(x.mode()[0]))
要是能确定每个分组里只有唯一的非空值,也可以用x.first()或x.last()替代x.mode()[0],效率会更高。
2. 同列前后向填充(适合有序数据)
如果你的数据是按顺序排列的(比如时间序列、有序记录),可以用相邻行的非空值填充:
# 前向填充:用上一行的非空值填充当前NaN themes['theme'] = themes['theme'].ffill() # 后向填充:用下一行的非空值填充当前NaN themes['theme'] = themes['theme'].bfill() # 组合使用:先前向再后向,确保所有NaN都被覆盖 themes['theme'] = themes['theme'].ffill().bfill()
3. 全局通用值填充(无关联分组时)
如果没有可关联的分组列,就用整列最常见的值(众数)填充NaN:
# 获取theme列的众数 theme_most_common = themes['theme'].mode()[0] # 填充NaN themes['theme'] = themes['theme'].fillna(theme_most_common)
4. 列间互补填充(两列互为备份)
如果你的两列是互补的(比如列A的NaN用列B的值填,列B的NaN用列A的值填),可以这么操作:
# 用col2的值填充col1的NaN,再反向填充 themes['col1'] = themes['col1'].fillna(themes['col2']) themes['col2'] = themes['col2'].fillna(themes['col1']) # 或者一行搞定整行填充(前提是每行至少有一个非空值) themes = themes.fillna(method='bfill', axis=1).fillna(method='ffill', axis=1)
内容的提问来源于stack exchange,提问作者Muzaffer
相关产品推荐
相关产品推荐

