如何在Pandas中按ID分组将DataFrame多行合并至单个单元格?
Pandas按ID合并多行数据到单个单元格
输入数据
import pandas as pd dict1 = {'ID': ['6610', '6610', '6610', '6620', '6620', '7540', '7540'], 'NEW_ID': ['6615', '6615', '6615', ' ', ' ', nan, nan], 'OLD_PRICE': [17.22, 17.9, 17.22, 27.49, 20.42, 30.73, 29.55], 'NEW_PRICE': [17.22, 17.22, 27.49, 18.99, 27.49, 29.55, 27.49], 'LABEL': [' NaN1', ' NaN2', ' NaN4', nan, ' Na', 'A', 'B']} df = pd.DataFrame(dict1)
解决方案
通过groupby按ID分组,对每列应用自定义清洗合并函数,处理空值、多余空格并合并去重后的内容:
def merge_and_clean(series): # 清洗步骤:去除空值、字符串前后空格,过滤空字符串 cleaned = series.dropna().apply(lambda x: x.strip() if isinstance(x, str) else x) cleaned = cleaned[cleaned != ''] # 去重后合并,用分号分隔 return '; '.join(map(str, cleaned.unique())) if len(cleaned) > 0 else '' # 按ID分组并聚合 merged_df = df.groupby('ID', as_index=False).agg(merge_and_clean)
处理后结果
执行以下代码查看输出:
print(merged_df)
输出内容:
ID NEW_ID OLD_PRICE NEW_PRICE LABEL 0 6610 6615 17.22; 17.9; 17.22 17.22; 27.49; 17.22 NaN1; NaN2; NaN4 1 6620 27.49; 20.42 18.99; 27.49 Na 2 7540 30.73; 29.55 29.55; 27.49 A; B
说明
- 自动处理
NaN、空白字符串、字符串前后多余空格 - 对每个ID下的列值去重,避免重复内容
- 空值/无效值处理后显示为空单元格
内容的提问来源于stack exchange,提问作者kamel Derouiche
相关产品推荐
相关产品推荐

