熊猫,groupby和伯爵

Goi*_*Way 7 python pandas pandas-groupby

我有一个像这样的数据框

>>> df = pd.DataFrame({'user_id':['a','a','s','s','s'],
                    'session':[4,5,4,5,5],
                    'revenue':[-1,0,1,2,1]})

>>> df
   revenue  session user_id
0       -1        4       a
1        0        5       a
2        1        4       s
3        2        5       s
4        1        5       s
Run Code Online (Sandbox Code Playgroud)

和会话和收入的每个值代表了一种类型的,我要统计每个种类的数量表示的数量revenue=-1session=4user_id=a为1.

我发现简单的调用count()函数,因为groupby()无法输出我想要的结果.

>>> df.groupby('user_id').count()
         revenue  session
user_id
a              2        2
s              3        3
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

cs9*_*s95 25

熊猫 >= 1.1:df.value_counts可用!

从 pandas 1.1 开始,这将是我推荐的计算组中行数(即组大小)的方法。要计算特定列的组中非 nan 行的数量,请查看已接受的答案

老的

df.groupby(['A', 'B']).size()   # df.groupby(['A', 'B'])['C'].count()
Run Code Online (Sandbox Code Playgroud)

[?]

df.value_counts(subset=['A', 'B']) 
Run Code Online (Sandbox Code Playgroud)

请注意,sizecount不相同,前者计数每个组的所有行,后者计数非空行只。有关更多信息,请参阅我的另一个答案


最小示例

pd.__version__
# '1.1.0.dev0+2004.g8d10bfb6f'

df = pd.DataFrame({'num_legs': [2, 4, 4, 6],
                   'num_wings': [2, 0, 0, 0]},
                  index=['falcon', 'dog', 'cat', 'ant'])
df
        num_legs  num_wings
falcon         2          2
dog            4          0
cat            4          0
ant            6          0
Run Code Online (Sandbox Code Playgroud)
df.value_counts(subset=['num_legs', 'num_wings'], sort=False)

num_legs  num_wings
2         2            1
4         0            2
6         0            1
dtype: int64
Run Code Online (Sandbox Code Playgroud)

将此输出与

df.groupby(['num_legs', 'num_wings'])['num_legs'].size()

num_legs  num_wings
2         2            1
4         0            2
6         0            1
Name: num_legs, dtype: int64
Run Code Online (Sandbox Code Playgroud)

表现

如果您不对结果进行排序,它也会更快:

%timeit df.groupby(['num_legs', 'num_wings'])['num_legs'].count()
%timeit df.value_counts(subset=['num_legs', 'num_wings'], sort=False)

640 µs ± 28.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
568 µs ± 6.88 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Run Code Online (Sandbox Code Playgroud)


WNG*_*WNG 16

您似乎想要一次分组几列:

df.groupby(['revenue','session','user_id'])['user_id'].count()
Run Code Online (Sandbox Code Playgroud)

应该给你你想要的东西


Ber*_*yse 5

我遇到了同样的问题,使用了上面提供的解决方案。您实际上可以指定要计算的任何列:

df.groupby(['revenue','session','user_id'])['revenue'].count()
Run Code Online (Sandbox Code Playgroud)

df.groupby(['revenue','session','user_id'])['session'].count()
Run Code Online (Sandbox Code Playgroud)

会给出同样的答案。