如何结合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
相关产品推荐
相关产品推荐

