Pandas如何统计不同列中相同值的数量

3

我希望您能够统计不同列中相同值的数量。 这里有一个更好的解释,我有这个 df(数据框)

df= pd.DataFrame([['Id1',1, 0, 'b', 'j'], ['Id2', 0, 2, 'c', 'g'], ['Id2',0, 1, 2,'je']]) 
df= df.rename({0:'IDcol', 1:'col1', 2:'col2', 3:'col3', 4:'col4'}, axis=1)
df

将显示以下数据框:

    IDcol   col1    col2    col3    col4
0   Id1     1       0       b       j
1   Id2     0       2       c       g
2   Id2     0       1       2       je

然后计算col1和col2中的所有值,得到类似以下结果:


    values  count
0      0      3
1      1      2
2      2      1

作为额外部分,应该很容易按ID列进行分组,然后获得类似于以下内容:
    Id   values count
0   Id1    0    1
1   Id1    1    1
2   Id1    2    0
3   Id2    0    2
4   Id2    1    1
5   Id2    2    0

我已经尝试了groupby、size和values_count的不同组合,但是我的size和value_count知识还不够广泛,所以可能会漏掉一些东西。

我认为也可以使用列表推导来实现,但如果可以使用pandas函数,处理时间会更好。

注:

1)此示例中使用int,但这也适用于字符串。

2)最好手动输入值。

2个回答

3

我不知道这个技巧,对于第一部分非常有效。由于我只能将一个答案标记为正确的答案,所以我会把它给sammywemmy,因为它还包括Id的部分。但请接受我的点赞和感激之情。 - Xander
1
@Xander 很高兴能帮忙,也感谢您。同意您应该接受 Sammy 的答案。我尝试想出一些简洁明了的回答,但其实跟 Sam 的回答差不多。 - Ch3steR

2
res = (df.set_index("IDcol")
       .filter(['col1','col2'])
       .stack()
       .groupby(level=0)
       .value_counts()
       .unstack(fill_value=0)
       .stack()
       .reset_index(name='count')
       .rename(columns={"level_1":"values"})
      )

res


   IDcol    values  count
0   Id1         0   1
1   Id1         1   1
2   Id1         2   0
3   Id2         0   2
4   Id2         1   1
5   Id2         2   1

@Ch3steR提供的解决方案比解决方案1更简短。希望有人能提出更简洁的解决方案2。


非常感谢!我不知道关于un/stack函数。 - Xander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接