如何对DataFrame分组并聚合拼接多列数据?
DataFrame分组多列拼接实现方案
需求
对指定DataFrame按['Year', 'Letter']分组,每组内每条记录的Number、Note、Text列值用|连接,组内所有拼接结果用; 分隔,最终输出指定格式的结果。
原始数据
import pandas as pd df = pd.DataFrame({ 'Year': [2022, 2022, 2022, 2022], 'Letter': ['a', 'b', 'a', 'b'], 'Number': [1, 1, 1, 3], 'Note': [8, 7, 6, 5], 'Text': ['hi', 'hello', 'bye', 'joe'] })
数据结构:
Year Letter Number Note Text 0 2022 a 1 8 hi 1 2022 b 1 7 hello 2 2022 a 1 6 bye 3 2022 b 3 5 joe
预期输出
Column Year Letter 2022 a 1|8|hi; 1|6|bye b 1|7|hello; 3|5|joe
问题分析
原尝试代码df.groupby(['Year', 'Letter']).agg(lambda x: '|'.join(x))仅对单个列内部的值做拼接,无法实现「每行多列先拼接,再聚合组内所有行」的逻辑,因此不符合需求。
正确实现方法
方法1:先构造单行拼接串,再分组聚合
# 将每行的Number、Note、Text转为字符串后用|连接 df['row_combined'] = df['Number'].astype(str) + '|' + df['Note'].astype(str) + '|' + df['Text'] # 分组后将组内的拼接串用; 分隔 result = df.groupby(['Year', 'Letter'])['row_combined'].agg('; '.join).to_frame('Column') print(result)
方法2:使用groupby.apply直接处理每组
def combine_group(group): # 遍历组内每行,拼接指定列 combined_rows = [f"{num}|{note}|{text}" for num, note, text in zip(group['Number'], group['Note'], group['Text'])] # 用; 分隔所有行结果 return '; '.join(combined_rows) # 分组应用处理函数,转为DataFrame并重命名列 result = df.groupby(['Year', 'Letter']).apply(combine_group).to_frame('Column') print(result)
两种方法均能得到符合预期的输出,方法1性能更优(避免逐行迭代),适合处理大数据量。
内容的提问来源于stack exchange,提问作者T C Molenaar
相关产品推荐
相关产品推荐

