如何用含重复次数的DataFrame高效填充另一DataFrame的缺失值?
高效填充方案(替代嵌套循环)
思路说明
核心是用Pandas向量化操作替代循环:先将df2按Repeat列展开为对应次数的行,再通过组内序号匹配df1中同Group的待填充行,最终完成NaN值填充。
代码实现
import pandas as pd # 原始数据 df1 = pd.DataFrame({'Group': ['xx', 'yy', 'zz', 'x', 'x', 'x','z','y','y','y','y'], 'Name': ['A', 'B', 'C', None, None, None, None, None, None, None, None], 'Value': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]}) df2 = pd.DataFrame({'Name': ['A', 'A', 'B', 'B'], 'Group': ['x', 'y', 'z', 'y'], 'Repeat': [3, 2, 1, 2]}) # 1. 将df2按Repeat列展开,生成对应次数的行 expanded_df2 = df2.loc[df2.index.repeat(df2['Repeat'])] # 2. 给每个Group的展开数据添加组内序号,用于匹配df1同组行 expanded_df2['idx'] = expanded_df2.groupby('Group').cumcount() # 3. 给df1待填充行添加组内序号 df1['idx'] = df1.groupby('Group').cumcount() # 4. 通过Group和idx匹配,填充Name列的NaN值 df1['Name'] = df1['Name'].fillna( df1.merge(expanded_df2, on=['Group', 'idx'], how='left')['Name_y'] ) # 清理临时列 df1 = df1.drop('idx', axis=1) print(df1)
结果验证
运行后得到的目标DataFrame:
Group Name Value 0 xx A 1 1 yy B 2 2 zz C 3 3 x A 4 4 x A 5 5 x A 6 6 z B 7 7 y A 8 8 y A 9 9 y B 10 10 y B 11
效率优势
全程使用Pandas内置向量化方法(repeat、groupby.cumcount、merge),规避Python层面循环,处理大数据量时性能提升明显。
内容的提问来源于stack exchange,提问作者parvez alam
相关产品推荐
相关产品推荐

