如何对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
相关产品推荐
相关产品推荐

