如何在Pandas DataFrame中按Name列聚合指定列的单元格值为拼接字符串
如何在Pandas DataFrame中按Name列聚合指定列的单元格值为拼接字符串
嘿,我来帮你搞定这个按Name聚合拼接列值的需求!其实不用拆分行再追加这么麻烦,用Pandas的groupby配合聚合函数就能轻松实现,而且效率还更高。
首先,先把你的示例数据构造出来方便复现:
import pandas as pd data = { 'Email': ['john.cena@gmail.com', 'damian.doe@gmail.com', 'john.smith@gmail.com'], 'Col1': ['CellStr11', 'CellStr11', 'CellStr21'], 'Col2': [1.4, 1.2, 1.2], 'Col3': ['CellStr13', 'CellStr13', 'CellStr23'], 'Name': ['John Cena', 'Matt Smith', 'John Cena'] } df = pd.DataFrame(data)
方法一:用groupby+agg实现(推荐)
这种方法最简洁高效,我们可以自定义一个拼接函数,然后对需要聚合的列应用这个函数,同时处理好不同数据类型的转换(比如Col2是数值型,要先转成字符串再拼接):
# 定义通用的拼接函数,把列内所有值转成字符串后用' / '连接 def join_with_slash(series): return ' / '.join(map(str, series)) # 按Name分组,指定每个列的聚合规则 aggregated_df = df.groupby('Name').agg({ 'Email': 'first', # 保留每组的第一个Email,要是想拼接所有Email也可以用join_with_slash 'Col1': join_with_slash, 'Col2': join_with_slash, 'Col3': join_with_slash }).reset_index() # 调整列顺序和你给出的示例一致 aggregated_df = aggregated_df[['Email', 'Col1', 'Col2', 'Col3', 'Name']] print(aggregated_df)
运行后就能得到你想要的结果:
Email Col1 Col2 Col3 Name 0 damian.doe@gmail.com CellStr11 1.2 CellStr13 Matt Smith 1 john.cena@gmail.com CellStr11 / CellStr21 1.4 / 1.2 CellStr13 / CellStr23 John Cena
方法二:用groupby+apply配合lambda
如果你更倾向于用apply和lambda的方式,也可以这么写:
aggregated_df_apply = df.groupby('Name').apply(lambda group: pd.Series({ 'Email': group['Email'].iloc[0], 'Col1': ' / '.join(group['Col1']), 'Col2': ' / '.join(map(str, group['Col2'])), 'Col3': ' / '.join(group['Col3']) })).reset_index()
这里的group是每个分组对应的子DataFrame,我们直接提取每个列的值进行拼接,逻辑和第一种方法类似,只是写法更灵活一点。
关于你之前的思路
你提到的拆分数据然后追加列的方法其实没必要,因为分组聚合后每个Name只会保留一行,所有列都会存在,不会出现部分行有额外列的情况,而且分组聚合的代码更简洁易维护。
要是还有其他疑问或者需要调整的地方,随时说哦~
备注:内容来源于stack exchange,提问作者badbadllama
相关产品推荐
相关产品推荐

