如何使用 python 中的 pandas 根据每个索引计算项目?

How could I count item based on each index by using pandas in python?

我有一个包含按索引排序的人员信息的数据框。例如,我的数据框如下所示。

#df
Name  A  B  C  D  E  F
John  1  0 -1 -1 -1  1
Lisa  0  1 -1  2  0  2
Mary  1  2  2  0  2  0

我想统计每个人在不同类别(即 A、B、C、D..)中的表现。然后我可以在结果中看到类似下面的内容。

#print result
     -1 0 1 2 
John  3 1 2 0
Lisa  1 2 1 2
Mary  0 2 1 3     

#which means John got 3 times in -1, 1 time in 0, 2 times in 1, and 0 times in 2. 
#A, B, C, D...etc does not matter to result. 

第一步我使用 df.T 转置数据帧,并尝试了类似 df.value_counts() 的方法,但是我会 喜欢根据每个人来计算它们,而不是使用 df.stack().value_counts()。而且似乎无法通过groupby()函数实现,

有谁知道如何在python中使用pandas得到它?

不知道是否可以更优雅,但你可以这样做:

>>> df.set_index('Name')
        .groupby(level=0)
        .apply(lambda x: x.stack().value_counts())
        .unstack()
        .fillna(0)

详细:

>>> df.set_index('Name')
>>> 
      A  B  C  D  E  F
Name                  
John  1  0 -1 -1 -1  1
Lisa  0  1 -1  2  0  2
Mary  1  2  2  0  2  0

>>> df.set_index('Name')
      .groupby(level=0)
      .apply(lambda x: x.stack().value_counts())
>>>
Name    
John  -1    3
       1    2
       0    1
Lisa   2    2
       0    2
      -1    1
       1    1
Mary   2    3
       0    2
       1    1

>>> df.set_index('Name')
    .groupby(level=0)
    .apply(lambda x: x.stack().value_counts())
    .unstack()
    .fillna(0)
>>>
          -1   0   1   2
Name                
John   3   1   2   0
Lisa   1   2   1   2
Mary   0   2   1   3