Python使用pandas合并同名行notes列内容的代码调整问题
Pandas同姓名行notes内容合并实现
需求说明
现有包含name、notes两列的大型表格,需要实现以下逻辑:
- 遍历
name列时,若当前行name值与上一行相同,就将当前行的notes内容追加到上一行notes末尾,再删除当前行 - 若不匹配则将当前
name作为新的匹配基准继续遍历 - 原有代码仅支持匹配固定姓名Jason,需改为支持匹配任意仅含字母、可带空格的姓名
- 最终输出每个姓名对应所有
notes内容用逗号加空格拼接的结果
测试数据
import pandas as pd data = {'name': ['Jason', 'Jason', 'Molly Jin', 'Molly Jin', 'Molly Jin', 'Tina', 'Tina', 'Tina','Jake Robins', 'Amy','Amy'], 'notes': ['Are you ok', 'just fine', 'I am here', 'where are you', 'over here', 'guest what','what','your funny','I am not here','what flavor','rasberry'] } df = pd.DataFrame(data)
原有代码缺陷
原有代码通过固定字符串匹配Jason,仅能对该姓名的行做合并,无法适配所有符合规则的姓名,也不能实现全量同姓名行的合并:
s = df['name'].shift(-1) #Looks for the row previous names col. t = df['notes'].shift(-1) #Looks for the row revious notes col. m = s.str.startswith('Jason', na=False) #Searches names col for name (needs a wildcard search) df.loc[m, 'notes'] += (', ' + t[m]) #grabs adjacent notes col. data and appends to previous #notes cell value with comma/space separator. print(df)
优化后代码
针对大型表格的性能需求,直接用pandas分组聚合实现,无需手动遍历,自动适配所有符合格式的姓名:
# 按name字段分组,将同姓名的所有notes用逗号+空格拼接 res_df = df.groupby('name', as_index=False, sort=False)['notes'].agg(', '.join) print(res_df)
注:加
sort=False参数可以保持原始数据中姓名的出现顺序,和需求的遍历逻辑输出顺序一致。
输出结果
name notes 0 Jason Are you ok, just fine 1 Molly Jin I am here, where are you, over here 2 Tina guest what, what, your funny 3 Jake Robins I am not here 4 Amy what flavor, rasberry
内容的提问来源于stack exchange,提问作者Boomer
相关产品推荐
相关产品推荐

