如何为DataFrame中A与Group_id为NaN的行匹配填充Group_id?
解决Pandas DataFrame中基于B、C列匹配填充Group_id的问题
问题重现
先构造你提供的示例DataFrame:
import pandas as pd import numpy as np df = pd.DataFrame({ 'A': ['A-1', np.nan, 'A-2', 'A-3'], 'B': ['B-1', 'B-2', 'B-2', 'B-4'], 'C': ['C-1', 'C-2', 'C-2', 'C-4'], 'Group_id': [1, np.nan, 2, 3] })
解决方案
这里提供两种简洁的实现方式:
方法一:利用映射字典填充
通过构建(B,C)与Group_id的映射关系,直接匹配填充目标行:
# 构建有效(B,C)到Group_id的映射(仅保留Group_id非空的行) group_mapping = df.dropna(subset=['Group_id']).set_index(['B', 'C'])['Group_id'] # 标记需要填充的行:A列为空且Group_id为空 target_mask = df['A'].isna() & df['Group_id'].isna() # 填充Group_id df.loc[target_mask, 'Group_id'] = df.loc[target_mask, ['B', 'C']].apply( lambda row: group_mapping.get((row['B'], row['C'])), axis=1 )
方法二:通过合并匹配填充
利用merge操作将目标行与参考行匹配,完成填充:
# 提取Group_id非空的参考数据 reference_df = df.dropna(subset=['Group_id'])[['B', 'C', 'Group_id']] # 筛选需要填充的行 target_rows = df[df['A'].isna() & df['Group_id'].isna()] # 合并匹配获取对应Group_id matched_rows = target_rows.merge(reference_df, on=['B', 'C'], how='left', suffixes=('', '_ref')) # 更新原DataFrame的Group_id df.loc[matched_rows.index, 'Group_id'] = matched_rows['Group_id_ref']
最终结果
两种方法执行后,DataFrame都会变为:
A B C Group_id 0 A-1 B-1 C-1 1.0 1 NaN B-2 C-2 2.0 2 A-2 B-2 C-2 2.0 3 A-3 B-4 C-4 3.0
内容的提问来源于stack exchange,提问作者M Kravets
相关产品推荐
相关产品推荐

