You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python3.7中GroupBy聚合后DataFrame缺失col5列的原因与解决方法

问题分析与解决

问题场景

原始DataFrame:

col1   col2      col3   col4   col5    col6
A20    hghjfg    jhdf   A20.1  abcd    direct
A20    hghjfg    jhdf   A20.2  edfg    direct
A20    hghjfg    jhdf   A20.3  rtzu    direct

想要按col1分组后,把其他列的唯一值用|拼接,得到这样的结果:

col1   col2      col3   col4                    col5                    col6
A20    hghjfg    jhdf   A20.1 | A20.2 | A20.3   abcd | edfg | rtzu      direct

用了这段代码:

join_unique = lambda x: ' | '.join(x.unique())
df.groupby(['col1'], as_index=False).agg(join_unique)

但输出结果里少了col5列。

问题原因

  1. 缺失值或类型不兼容:要是col5里有NaN(缺失值),x.unique()会把NaN也包含进去,但str.join()只能拼接字符串,碰着NaN就会出问题,Pandas就会偷偷跳过这列不处理。
  2. 旧版Pandas的坑:老版本的Pandas在自动处理所有列聚合时,要是某列聚合出了隐性错误,不会提示,直接跳过该列。

解决方法

方法1:先处理col5的缺失值和类型

先把col5转成字符串类型,空值填成空字符串,再聚合:

# 处理col5的缺失值,转成字符串类型
df['col5'] = df['col5'].fillna('').astype(str)
# 定义聚合函数
join_unique = lambda x: ' | '.join(x.unique())
# 分组聚合
result = df.groupby(['col1'], as_index=False).agg(join_unique)

方法2:明确指定要聚合的列

直接把所有要处理的列列出来,强制Pandas处理每一列,避免它偷偷跳过:

join_unique = lambda x: ' | '.join(x.unique())
# 列出所有要聚合的列
agg_cols = ['col2', 'col3', 'col4', 'col5', 'col6']
result = df.groupby(['col1'], as_index=False)[agg_cols].agg(join_unique)

方法3:优化聚合函数,兼容异常情况

改一下聚合函数,先过滤掉空值和非字符串的内容:

import pandas as pd

def join_unique(x):
    # 过滤空值,把有效内容转成字符串
    unique_vals = [str(val) for val in x.unique() if pd.notna(val) and val != '']
    return ' | '.join(unique_vals)

result = df.groupby(['col1'], as_index=False).agg(join_unique)

内容的提问来源于stack exchange,提问作者rshar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 13:26:35