如何通过Pandas分组去重并合并字符串列?非聚合场景实现
嘿,我懂你的意思了——你想把DataFrame里同组重复项的字符串列合并起来,但又不想用那种常规groupby聚合后丢掉其他行的操作对吧?其实有几种灵活的办法能搞定,我给你拆解下:
方法1:保留所有行,添加合并后的字符串列(用transform)
这应该就是你说的「不需要聚合函数的groupby操作」——transform不会把行聚合起来,而是把分组计算的结果广播到每一行,完美保留原数据结构。
举个实际例子,假设你的example DataFrame结构如下:
import pandas as pd example = pd.DataFrame({ 'school_lvl': ['Elem', 'Elem', 'Middle', 'Middle'], 'schl_name': ['Sunny', 'Sunny', 'Oak', 'Oak'], 'elem_name': ['Sunny Elem', 'Sunny Elem', 'Oak Middle', 'Oak Middle'], 'remarks': ['Clean', 'Friendly', 'Large', 'Modern'] })
执行下面的代码,就能给每一行添加上对应elem_name分组下合并后的remarks:
# 按elem_name分组,合并remarks列并映射到每一行 example['merged_remarks'] = example.groupby('elem_name')['remarks'].transform(lambda x: ', '.join(x))
输出结果会是:
| school_lvl | schl_name | elem_name | remarks | merged_remarks |
|---|---|---|---|---|
| Elem | Sunny | Sunny Elem | Clean | Clean, Friendly |
| Elem | Sunny | Sunny Elem | Friendly | Clean, Friendly |
| Middle | Oak | Oak Middle | Large | Large, Modern |
| Middle | Oak | Oak Middle | Modern | Large, Modern |
方法2:合并重复分组为单行(灵活聚合)
如果你想把同一分组的行合并成唯一一行,同时合并字符串列,用groupby+agg也很直观——这里的「聚合」其实就是字符串拼接,完全符合你的合并需求。
比如还是上面的例子,执行:
# 按分组键聚合,合并remarks列,其他列保留第一个值 result = example.groupby(['school_lvl', 'schl_name', 'elem_name'], as_index=False).agg( merged_remarks=('remarks', ', '.join) )
得到的结果是去重后的分组行,带合并后的字符串:
| school_lvl | schl_name | elem_name | merged_remarks |
|---|---|---|---|
| Elem | Sunny | Sunny Elem | Clean, Friendly |
| Middle | Oak | Oak Middle | Large, Modern |
方法3:针对特定重复列合并
如果你的「重复项」是指某几列(比如school_lvl和schl_name)完全重复,想合并对应的字符串列,可以先分组合并,再和去重后的原数据合并:
# 先分组合并目标字符串列 merged_strings = example.groupby(['school_lvl', 'schl_name'])['remarks'].apply(', '.join).reset_index() # 合并回原数据,只保留唯一分组行 final_result = example.drop_duplicates(['school_lvl', 'schl_name']).merge(merged_strings, on=['school_lvl', 'schl_name'])
这样能精准针对你指定的重复列进行合并操作。
内容的提问来源于stack exchange,提问作者M3105
相关产品推荐
相关产品推荐

