Pandas DataFrame分组聚合后col4缺失的问题求助
Pandas分组聚合丢失列的解决方法
问题场景
按指定列分组后,将其他列的唯一值用' | '分隔聚合,但结果中丢失了col4列。
示例数据
原始DataFrame:
col1 col2 col3 col4 THREE M SYNDROME 1 {3-M syndrome 1, 273750 (3)} 3-m syndrome 1 {3-M syndrome 1} 273750 THREE M SYNDROME 1 {3-M syndrome 1, 273750 (3)} 3-m syndrome 2 {3-M syndrome 2} 273750
预期结果:
col1 col2 col3 col4 THREE M SYNDROME 1 {3-M syndrome 1, 273750 (3)} 3-m syndrome 1 | 3-m syndrome 2 {3-M syndrome 1} | {3-M syndrome 2} 273750
当前代码及问题
使用以下代码后,结果中缺少col4:
join_unique = lambda x: ' | '.join(x.unique()) df2= df.groupby(['preferred_title_symbol'], as_index=False).agg(join_unique)
原因及解决方案
原因
col4为数值类型(如整数),x.unique()返回数值数组,直接用str.join()会触发类型错误,Pandas会自动跳过无法聚合的列,导致col4丢失。- 分组列名与示例数据中的列名不匹配(示例中分组列应为
col1,而非preferred_title_symbol)。
解决代码
方案1:统一处理所有列(兼容字符串/数值类型)
修改聚合函数,先将所有元素转为字符串再进行拼接,同时修正分组列名:
join_unique = lambda x: ' | '.join(map(str, x.unique())) # 确保分组列名与实际DataFrame一致,示例中为col1 df2 = df.groupby(['col1'], as_index=False).agg(join_unique)
方案2:针对不同列指定聚合逻辑
如果希望数值列在唯一值仅一个时保留原格式,可自定义各列的聚合规则:
agg_rules = { 'col2': lambda x: ' | '.join(x.unique()), 'col3': lambda x: ' | '.join(x.unique()), 'col4': lambda x: x.unique()[0] # 直接取唯一值(示例中该列值无重复) } df2 = df.groupby(['col1'], as_index=False).agg(agg_rules)
以上两种方式都能确保col4被正确包含在聚合结果中。
内容的提问来源于stack exchange,提问作者rshar
相关产品推荐
相关产品推荐

