如何使用Pandas基于多条件将多行合并为一行
解决DataFrame按Phone+Email合并多行的问题
嘿,这问题我之前也碰到过,用Pandas的分组聚合就能轻松搞定!核心思路就是把phone和email作为分组依据,把同一组里的entity和account_no字段合并到一行。下面一步步给你演示:
步骤1:准备数据(模拟你的示例)
先把你给的示例数据转成Pandas DataFrame,修正了原数据里可能的排版误差(确保匹配行的phone+email完全一致):
import pandas as pd data = { 'entity': ['E01', 'E02', 'E03', 'E04', 'E05', 'E06', 'E07', '', '', '', '', ''], 'phone': ['22', '33', '55', '66', '77', '88', '100', '22', '33', '55', '66', '99'], 'email': ['minhkhang@gmail.com', 'hoangyen@gmail.com', 'tmai@hotmail.com', 'thuthao@gmail.com', 'lamanh@gmail.com', 'tuantu@gmail.com', 'maidao@gmail.com', 'minhkhang@gmail.com', 'hoangyen@gmail.com', 'thanh mai@gmail.com', 'tthao@hotmail.com', 'hoangkien@gmail.com'], 'account_no': ['', '', '', '', 'M05', 'M06', '', 'M01', 'M02', 'M03', 'M04', 'M07'] } df = pd.DataFrame(data)
步骤2:处理空值
把数据里的空字符串换成Pandas的pd.NA,方便后续分组和聚合时正确忽略空值:
df = df.replace('', pd.NA)
步骤3:分组合并核心操作
用groupby按phone和email分组,对entity和account_no做聚合——把同一组里的非空值用空格拼接起来(如果不需要去重,去掉.unique()即可):
merged_df = df.groupby(['phone', 'email'], dropna=False).agg( entity=('entity', lambda x: ' '.join(x.dropna().unique())), account_no=('account_no', lambda x: ' '.join(x.dropna().unique())) ).reset_index(drop=True)
步骤4:还原空字符串格式
最后把pd.NA换回空字符串,和你期望的结果格式对齐:
merged_df = merged_df.fillna('')
最终结果
运行完上面的代码,你就能得到和示例一致的结果:
entity account_no 0 E01 M01 1 E02 M02 2 E03 M03 3 E04 M04 4 E05 M05 5 E06 M06 6 E07 7 M07
补充说明
- 如果你的原始数据里空值本来就是
NaN而不是空字符串,可以跳过步骤2。 - 要是合并时需要用其他分隔符(比如逗号),把
' '换成', '就行。 dropna=False参数是为了保留那些phone或email为空的行,如果不需要可以去掉。
内容的提问来源于stack exchange,提问作者Tien Vu
相关产品推荐
相关产品推荐

