Pandas按a、b两列分组统计d列不同值出现次数的实现问题
错误原因
你写的代码逻辑完全不匹配需求,问题出在两点:
df.groupby('a')['b'].value_counts()返回的是以(a, b)为多级索引、值为每组计数结果的Series,它既不是对应原DataFrame行的布尔掩码,也不是合法的行号/行标签,不能直接用来索引df['d']- 你没有把
d列纳入分组统计的逻辑,自然得不到d列不同取值的计数结果
实现方案
方法1:直接分组统计(输出多级索引长表)
直接将a、b作为分组键,对d列做值统计即可,代码如下:
print(df.groupby(['a', 'b'])['d'].value_counts())
输出结果示例:
a b d john 1 1 2 2 0 1 1 1 3 0 1 mary 1 0 1 2 0 1 Name: count, dtype: int64
可以直接看到每个(a, b)分组下d取0、1的次数,和你要求的场景完全匹配:比如a=john、b=1时d=1共出现2次,a=john、b=3时d=0共出现1次。
方法2:转宽表更易读
如果希望0、1作为单独列展示,没有出现的取值默认计数为0,可以加unstack处理:
print(df.groupby(['a', 'b'])['d'].value_counts().unstack(fill_value=0))
输出结果示例:
d 0 1 a b john 1 0 2 2 1 1 3 1 0 mary 1 1 0 2 1 0
方法3:用交叉表直接生成宽表
也可以用pd.crosstab一步得到宽表结果:
print(pd.crosstab(index=[df['a'], df['b']], columns=df['d']))
输出结果和方法2完全一致。
内容的提问来源于stack exchange,提问作者john johns
相关产品推荐
相关产品推荐

