如何用Pandas的groupby和value_counts生成DataFrame的Count列?
问题:为DataFrame按分组添加颜色出现次数列
现有如下示例DataFrame:
Type Color A Blue A Orange A Green A Green A Red A Red A Red B Blue B Orange B Green B Green B Red B Red B Red C Blue C Orange C Green C Green C Red C Red C Red D Blue D Orange D Green D Green D Red D Red D Red E Blue E Orange E Green E Green E Red E Red E Red
需要新增名为Count的列,统计每个Type分组内对应Color的出现次数,最终效果如下:
Type Color Count A Blue 1 A Orange 1 A Green 2 A Green 2 A Red 3 A Red 3 A Red 3 B Blue 1 B Orange 1 B Green 2 B Green 2 B Red 3 B Red 3 B Red 3 C Blue 1 C Orange 1 C Green 2 C Green 2 C Red 3 C Red 3 C Red 3 D Blue 1 D Orange 1 D Green 2 D Green 2 D Red 3 D Red 3 D Red 3 E Blue 1 E Orange 1 E Green 2 E Green 2 E Red 3 E Red 3 E Red 3
尝试使用代码df.groupby(['Type', 'Color']).value_counts()时,无法生成新列,赋值还会出现索引错误,求正确实现方法。
解决方案
方法1:使用groupby + transform(推荐)
transform方法会将分组计算的结果广播到原DataFrame的每一行,自动匹配索引,不会出现错误。代码如下:
# 用transform('count')实现 df['Count'] = df.groupby(['Type', 'Color'])['Color'].transform('count') # 或使用transform('size'),效果完全一致 df['Count'] = df.groupby(['Type', 'Color'])['Color'].transform('size')
方法2:分组统计后合并回原表
先计算每个Type+Color组的计数,再通过merge合并到原DataFrame:
# 第一步:计算分组计数并转为DataFrame count_df = df.groupby(['Type', 'Color']).size().reset_index(name='Count') # 第二步:合并到原表 df = df.merge(count_df, on=['Type', 'Color'], how='left')
两种方法都能得到需求中的结果,其中方法1更简洁高效,不需要额外的合并操作。
内容的提问来源于stack exchange,提问作者nami
相关产品推荐
相关产品推荐

