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

如何对DataFrame按ID分组并合并多列数据至单列?

问题解决:按ID合并多列地理信息

原代码问题分析

你写的save = df.groupby('ID').agg(lambda x: ';'.join(set(x)))存在几个关键问题:

  • 仅对单列进行聚合,没有合并x、y、z三列的内容;
  • 未处理单元格内的分号分隔内容(比如vermont; new york会被当作单个元素);
  • 使用set(x)强制去重,但你的需求是保留重复值(如ID2中的florida);
  • 未过滤空字符串,会导致结果出现多余的分号。

正确实现步骤

1. 构造示例DataFrame

import pandas as pd

df = pd.DataFrame({
    'ID': [1,2,2,3,1],
    'x': ['new york', 'vermont; new york', 'oregon', 'new jersey', 'hawai'],
    'y': ['', 'carolina n', 'texas', '', 'utah'],
    'z': ['california', 'florida', 'florida; colorado', '', '']
})

2. 定义清洗拆分函数

处理每个单元格,拆分分号、去除空格、过滤空值:

def split_clean(s):
    if pd.isna(s) or s.strip() == '':
        return []
    return [item.strip() for item in s.split(';') if item.strip()]

3. 合并每行的地理元素

将每行x、y、z的内容拆分后合并为一个列表:

df['geo_list'] = df.apply(
    lambda row: split_clean(row['x']) + split_clean(row['y']) + split_clean(row['z']),
    axis=1
)

4. 按ID分组聚合

将每个ID对应的所有地理元素拼接为分号分隔的字符串:

result = df.groupby('ID')['geo_list'].sum().apply(lambda x: '; '.join(x)).reset_index(name='geo')

最终输出结果

ID                                                                 geo
0   1                                new york; california; hawai; utah
1   2  vermont; new york; carolina n; oregon; texas; florida; florida; colorado
2   3                                                         new jersey

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 03:46:00