如何使用 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
我有一个包含按索引排序的人员信息的数据框。例如,我的数据框如下所示。
#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