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

如何结合groupby()与concat()按组拼接多个DataFrame?

实现按组拼接DataFrame的方案

嘿,这个需求用groupby()和concat()完全可以实现,我给你拆解具体步骤,代码可直接复用:

第一步:先还原你的输入数据

首先我们先把你给出的df1和df2用代码创建出来,方便后续测试:

import pandas as pd

# 创建df1(对应你给出的结构)
df1 = pd.DataFrame(
    data=[[0, 1, 4], [0, 2, 5], [1, 1, 3]],
    columns=['a', 'b', 'c'],
    index=[1, 2, 3]
)

# 创建df2(对应你给出的结构)
df2 = pd.DataFrame(
    data=[[0, 1, 5], [0, 2, 5], [1, 1, 4]],
    columns=['a', 'b', 'c'],
    index=[1, 2, 3]
)

第二步:核心实现逻辑

因为两个DataFrame的a、b分组完全一致,我们可以先对两者按a和b分组,然后遍历每个分组键,把df1的对应组和df2的对应组上下拼接,最后把所有拼接好的组合并成最终结果:

# 对两个DataFrame按a、b分组
groups_df1 = df1.groupby(['a', 'b'])
groups_df2 = df2.groupby(['a', 'b'])

# 收集每个拼接后的分组结果
combined_list = []
for group_key in groups_df1.groups.keys():
    # 取出当前分组键对应的两组数据
    part1 = groups_df1.get_group(group_key)
    part2 = groups_df2.get_group(group_key)
    # 拼接:df1的组在上,df2的组在下
    combined_part = pd.concat([part1, part2], ignore_index=False)
    combined_list.append(combined_part)

# 合并所有分组,并重设索引为你需要的连续序号
final_result = pd.concat(combined_list, ignore_index=True)
final_result.index = range(1, len(final_result) + 1)

验证结果

运行后final_result就是你想要的结构:

a  b  c
1  0  1  4
2  0  1  5
3  0  2  5
4  0  2  5
5  1  1  3
6  1  1  4

更简洁的写法(列表推导式)

如果想简化代码,可以用列表推导式一步完成:

final_result = pd.concat(
    [pd.concat([groups_df1.get_group(k), groups_df2.get_group(k)]) 
     for k in groups_df1.groups.keys()],
    ignore_index=True
)
final_result.index = range(1, len(final_result) + 1)

补充说明

因为你已经明确两个DataFrame的a、b分组完全一致,所以我们直接遍历groups_df1的分组键即可,不用担心出现分组键不存在的情况。如果后续有分组不一致的场景,可以额外加个判断(比如检查group_key是否在groups_df2中)来避免报错。

内容的提问来源于stack exchange,提问作者MirekG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 17:12:35