合并同ID对应Pandas DataFrame的A、B列并去重ID的方法
解决方案
核心思路
不能直接用next(b)跳过同ID的其他DataFrame,需要遍历每个ID分组内的所有DataFrame,对A、B列做求和操作,C列取任意一个(因同ID的C列值一致)。注意:itertools.groupby仅对连续相同的键分组,若原ID列表未排序,需先按ID排序。
代码实现
步骤1:确保分组前ID有序(可选但必要)
如果原id列表不是按ID值排序的,先对df_groups按ID排序:
# 按ID排序,保证同ID的元素连续 df_groups_sorted = sorted(df_groups, key=lambda x: x[0])
步骤2:分组处理求和
from itertools import groupby import pandas as pd result = [] for id_val, group in groupby(df_groups_sorted, key=lambda x: x[0]): # 提取当前ID下的所有DataFrame dfs_in_group = [df for _, df in group] # 方式1:高效逐列求和(适用于所有df结构完全一致的场景) summed_df = pd.DataFrame({ "A": sum(df["A"] for df in dfs_in_group), "B": sum(df["B"] for df in dfs_in_group), "C": dfs_in_group[0]["C"] # 取第一个df的C列,因同ID值一致 }, index=dfs_in_group[0].index) # 方式2:合并后聚合(适用于df行顺序可能不一致的场景) # combined = pd.concat(dfs_in_group) # summed_df = combined.groupby(combined.index).agg( # A="sum", # B="sum", # C="first" # ) # 将结果加入列表 result.append((id_val, summed_df))
说明
- 方式1效率更高,前提是同ID下的所有DataFrame行数、索引、列顺序完全一致;
- 方式2更灵活,即使同ID的df行顺序不同,也能通过索引对齐求和;
- 最终
result就是去重后的列表,每个元素为(唯一ID, 合并求和后的DataFrame)。
内容的提问来源于stack exchange,提问作者verynovice
相关产品推荐
相关产品推荐

