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

如何为Pandas原DataFrame每行匹配对应分组大小?求更优方案

高效为DataFrame每行匹配所属分组大小的方法

问题背景

我有两个DataFrame:

  • 从CSV读取的原始数据df_k1
  • 按除最后一列外所有列分组后得到的k1_grouped(包含分组大小Count列)

目前通过嵌套循环为原DataFrame每行匹配对应分组的大小,但这种方法效率极低,想要更快、更优雅的实现方式。

原低效代码:

df_k1 = pd.read_csv(filename, sep=';')
columns_for_groups = list(df_k1.columns)[:-1]
k1_grouped = df_k1.groupby(columns_for_groups).size().reset_index(name="Count")

size_by_row = []
for row in df_k1.itertuples():
    for group in k1_grouped.itertuples():
        if row[1:-1] == group[1:-1]:
            size_by_row.append(group[-1])
            break
group_size = pd.Series(size_by_row)

最优解决方案:用groupby.transform一步实现(推荐)

完全不需要提前生成k1_grouped,Pandas的groupby.transform方法可以直接为每行返回对应分组的大小,这是原生高效实现,时间复杂度远低于嵌套循环。

代码示例:

df_k1 = pd.read_csv(filename, sep=';')
columns_for_groups = list(df_k1.columns)[:-1]

# 直接生成对应每行的分组大小Series
group_size = df_k1.groupby(columns_for_groups)[df_k1.columns[-1]].transform('size')

说明:transform('size')会计算每个分组的大小,自动将结果广播到该分组的每一行,最终得到的Series和原DataFrame行数一致、顺序完全匹配。


备选方案:若已存在k1_grouped,用多列合并关联

如果已经提前生成了k1_grouped,可以通过多列merge将Count列关联回原DataFrame,再提取为Series:

代码示例:

df_k1 = pd.read_csv(filename, sep=';')
columns_for_groups = list(df_k1.columns)[:-1]
k1_grouped = df_k1.groupby(columns_for_groups).size().reset_index(name="Count")

# 按分组列左连接,保留原数据的所有行和顺序
merged_df = df_k1.merge(k1_grouped, on=columns_for_groups, how='left')
group_size = merged_df['Count']

说明:merge的on参数指定用于匹配的分组列,how='left'确保原DataFrame的每一行都能匹配到对应的分组大小,效率远高于嵌套循环。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 11:15:44