Pandas自合并处理缺失结构:合并重复分组的缺失列
解决Pandas DataFrame自合并补全缺失值的问题
嘿,这个场景我熟!咱们可以通过自合并+分组提取完整信息的方式来补全这个DataFrame的缺失结构,具体操作看下面:
1. 先还原你的原始数据
首先先把你给出的DataFrame代码和输出放出来,方便对照:
原始代码
from numpy import nan import pandas as pd data = {'A': {0: 1, 1: 2, 2: 1, 3: 2}, 'B': {0: 0.1, 1: 0.5, 2: 0.1, 3: 0.5}, 'C1': {0: 9.0, 1: 9.0, 2: nan, 3: nan}, 'C2': {0: 9.0, 1: 9.0, 2: nan, 3: nan}, 'D1': {0: nan, 1: nan, 2: 6.0, 3: 6.0}, 'D2': {0: nan, 1: nan, 2: 6.0, 3: 6.0}} df = pd.DataFrame(data)
原始输出
A B C1 C2 D1 D2 0 1 0.1 9.0 9.0 NaN NaN 1 2 0.5 9.0 9.0 NaN NaN 2 1 0.1 NaN NaN 6.0 6.0 3 2 0.5 NaN NaN 6.0 6.0
2. 自合并补全缺失值的方法
观察数据能发现:同一(A,B)组合的行,缺失的是互补的列——比如(1,0.1)的两行,一行有C列值、一行有D列值;(2,0.5)同理。所以我们可以先提取每个(A,B)组合的完整非缺失数据,再和原数据合并。
具体步骤代码
# 第一步:按A、B分组,提取每组的完整非缺失数据(因为同组非缺失值重复,用first()/max()都可以) grouped_full = df.groupby(['A', 'B']).first().reset_index() # 第二步:用原数据的A、B列和完整数据做内合并,补全所有缺失列 result_df = df[['A', 'B']].merge(grouped_full, on=['A', 'B'], how='inner')
合并后的输出
A B C1 C2 D1 D2 0 1 0.1 9.0 9.0 6.0 6.0 1 2 0.5 9.0 9.0 6.0 6.0 2 1 0.1 9.0 9.0 6.0 6.0 3 2 0.5 9.0 9.0 6.0 6.0
3. 补充:更简洁的填充方式(逻辑类似)
如果不想显式做合并,也可以用groupby.transform直接在原数据上填充,本质是一样的分组取完整值的逻辑:
# 对所有列按A、B分组填充缺失值 filled_df = df.groupby(['A', 'B']).transform('first') # 把A、B列还原回去(因为transform会覆盖,不过其实原数据A、B没有缺失,也可以直接用df[['A','B']]) filled_df[['A', 'B']] = df[['A', 'B']]
这样得到的结果和合并方式完全一致。
内容的提问来源于stack exchange,提问作者gaow
相关产品推荐
相关产品推荐

