如何在Pandas中实现两个DataFrame合并时的缺失数据补全与结果规整
解决Pandas分组后补全缺失行并保留分组键的问题
你的问题核心是每个a分组需要与df2的所有x值做全匹配,但之前的代码在merge后丢失了分组的a值(变成NaN)。下面提供两种通用的解决方案,都能满足你的需求:
方案一:在GroupBy Apply中填充分组键
在分组后的merge操作里,直接将当前分组的a值(也就是group.name)赋值给结果的a列,确保即使没有匹配到x,a值也不会丢失:
import pandas as pd # 初始化你的数据 df1 = pd.DataFrame({'a':['11','11','11','11','22','22','43','43'], 'x': ['d1', 'd2','d3','d4','d1','d2','d1','d3'], 'b': [1, 2,3,4,5,6,7,8]}) df2 = pd.DataFrame({'x': ['d1', 'd2','d3','d4']}) # 分组处理并补全a值 result = df1.groupby('a', group_keys=False).apply( lambda group: group.merge(df2, on='x', how='right').assign(a=group.name) ).reset_index(drop=True) print(result)
方案二:先构建全量组合再左连接(更直观高效)
先生成所有a和x的笛卡尔积(也就是所有可能的组合),再与原df1左连接,自动补全缺失的b值为NaN:
import pandas as pd # 初始化你的数据 df1 = pd.DataFrame({'a':['11','11','11','11','22','22','43','43'], 'x': ['d1', 'd2','d3','d4','d1','d2','d1','d3'], 'b': [1, 2,3,4,5,6,7,8]}) df2 = pd.DataFrame({'x': ['d1', 'd2','d3','d4']}) # 生成所有a-x的全量组合 full_a_x = pd.MultiIndex.from_product( [df1['a'].unique(), df2['x']], names=['a', 'x'] ).to_frame(index=False) # 左连接获取b值 result = full_a_x.merge(df1, on=['a', 'x'], how='left') print(result)
输出结果(两种方案都能得到)
a x b 0 11 d1 1.0 1 11 d2 2.0 2 11 d3 3.0 3 11 d4 4.0 4 22 d1 5.0 5 22 d2 6.0 6 22 d3 NaN 7 22 d4 NaN 8 43 d1 7.0 9 43 d2 NaN 10 43 d3 8.0 11 43 d4 NaN
方案选择建议
- 方案一适合后续需要在分组内做更多复杂处理的场景;
- 方案二更简洁高效,对于你150-200行的数据集来说,执行速度和可读性都更优。
内容的提问来源于stack exchange,提问作者GABRIEL ANDRADE QUEIROZ
相关产品推荐
相关产品推荐

