pandas DataFrame按同Id聚合补全空值并处理A列多值冲突的实现
实现方法
首先先做数据预处理,将表格中的空白占位符统一转换为pandas可识别的空值类型:
import pandas as pd import numpy as np # 从文件导入的场景,把空格识别为空值 df = pd.read_csv('your_file.csv', na_values=[' ']) # 手动构造DataFrame的场景,用正则替换空白内容为空值 # df = df.replace(r'^\s*$', np.nan, regex=True)
核心分组聚合逻辑
自定义聚合规则,分别处理A列的冲突检测和其余列的空值补全:
def agg_func(group): # 处理A列:同组唯一非空值数量大于1则返回冲突标记'f',否则返回唯一值 a_unique = group['A'].dropna().unique() res = { 'A': 'f' if len(a_unique) > 1 else a_unique[0] } # 处理B、C、D列:取同组第一个非空值补全空值 for col in ['B', 'C', 'D']: res[col] = group[col].dropna().iloc[0] return pd.Series(res) # 按Id分组聚合得到结果 result = df.groupby('Id').apply(agg_func).reset_index()
效果验证
场景1:无A列冲突
输入符合你给出的第一个示例结构时,输出和预期完全一致:
Id A B C D 1 a b c d 2 a b c d 3 a b c d
场景2:存在A列冲突
输入符合你给出的第二个冲突示例结构时,输出和预期完全一致:
Id A B C D 1 a b c d 2 f b c d
如果需要调整冲突标记值,直接替换代码中的'f'为你指定的其他值即可。
内容的提问来源于stack exchange,提问作者Will
相关产品推荐
相关产品推荐

