我有一个数据框,其中包含按索引排序的人员信息。例如,我的数据框如下所示。
#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来获取它?
答案 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