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列。
问题原因
- 缺失值或类型不兼容:要是
col5里有NaN(缺失值),x.unique()会把NaN也包含进去,但str.join()只能拼接字符串,碰着NaN就会出问题,Pandas就会偷偷跳过这列不处理。 - 旧版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
相关产品推荐
相关产品推荐

