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

