Pandas:基于其他行条件填充数据行的实现方法
看起来你需要根据DataFrame中已有的完整行数据,来填充那些缺失字段的行对吧?我来帮你一步步解决这个问题。
首先,先还原你的示例数据集(方便演示):
import pandas as pd import numpy as np data = { 'Group': ['Group_A', 'Group_A_Ltd', 'Group_B', 'Group_GTY', 'Group_A', 'Group_BGG'], 'Name_X': ['Company_PJ', 'Company_PJ', 'Company_XYZ', 'Company_R', 'Company_PJ', 'Company_VV'], 'Name_Y': ['Company_PJ', np.nan, np.nan, 'Company_R', np.nan, 'Company_VV'], 'Code': ['M001', np.nan, np.nan, 'M020', np.nan, 'M021'], 'Group_Code': ['1-00-002', np.nan, np.nan, '1-00-033', np.nan, np.nan], 'Group_Correct': ['Group_A', np.nan, np.nan, 'Group_GTY', np.nan, np.nan] } df = pd.DataFrame(data)
接下来分三步解决:
1. 构建参考映射表
首先从那些有完整数据的行(也就是Group_Correct不为空的行)提取出每个正确组对应的字段值,做成一个字典方便后续调用:
# 筛选出有完整Group_Correct的行,去重后保留需要的列 reference = df.dropna(subset=['Group_Correct']).drop_duplicates('Group_Correct')[['Group_Correct', 'Name_Y', 'Code', 'Group_Code']] # 转为字典,key是Group_Correct,value是对应字段的字典 group_ref = reference.set_index('Group_Correct').to_dict('index')
2. 补全所有行的Group_Correct字段
现在需要把那些缺失Group_Correct的行(比如Group_A_Ltd、Group_BGG)关联到正确的组。这里假设你的Group字段是正确组的变体(比如带后缀),可以用字符串提取来匹配:
# 提取Group字段里的核心组名(比如从Group_A_Ltd提取Group_A) df['Group_Correct'] = df['Group_Correct'].fillna(df['Group'].str.extract(r'(Group_[A-Za-z]+)')[0])
如果你的命名规则不是这种前缀式的,也可以手动创建映射表来匹配:
# 手动定义Group到Group_Correct的映射 group_mapping = { 'Group_A_Ltd': 'Group_A', 'Group_BGG': 'Group_B' } df['Group_Correct'] = df['Group_Correct'].fillna(df['Group'].map(group_mapping))
3. 填充缺失的字段
最后根据Group_Correct的值,从参考字典里取出对应的值填充缺失字段:
# 遍历需要填充的列 for col in ['Name_Y', 'Code', 'Group_Code']: df[col] = df.apply( lambda row: group_ref[row['Group_Correct']][col] if pd.isna(row[col]) else row[col], axis=1 )
现在看处理后的结果:
print(df)
输出:
Group Name_X Name_Y Code Group_Code Group_Correct 0 Group_A Company_PJ Company_PJ M001 1-00-002 Group_A 1 Group_A_Ltd Company_PJ Company_PJ M001 1-00-002 Group_A 2 Group_B Company_XYZ NaN NaN NaN Group_B 3 Group_GTY Company_R Company_R M020 1-00-033 Group_GTY 4 Group_A Company_PJ Company_PJ M001 1-00-002 Group_A 5 Group_BGG Company_VV Company_VV M021 NaN Group_B
注意:如果Group_B对应的完整数据还没出现在你的DataFrame里,那它的字段还是会保留NaN,你可以后续补充完整数据后再重复这个流程。
内容的提问来源于stack exchange,提问作者Funkeh-Monkeh
相关产品推荐
相关产品推荐

