我如何通过在python中使用pandas来根据每个索引计算项目?

时间:2015-03-01 13:14:09

标签: python pandas dataframe

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

#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来获取它?

1 个答案:

答案 0 :(得分:0)

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

>>> 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