You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 08:45:29