Python 熊猫、groupby和count

Python 熊猫、groupby和count,python,pandas,pandas-groupby,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

我有这样一个数据框

>>> 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
session和revenue的每个值代表一种类型,我想计算每种类型的数量,比如说
revenue=-1
user\u id=a
session=4
的数量是1

我发现
groupby()
之后的简单调用
count()
函数无法输出我想要的结果

>>> df.groupby('user_id').count()
         revenue  session
user_id
a              2        2
s              3        3

我怎样才能做到这一点?

您似乎希望同时按多个列进行分组:

df.groupby(['revenue','session','user_id'])['user_id'].count()

应该给你你想要的

我也在为同样的问题挣扎,利用了上面提供的解决方案。实际上,您可以指定任何要计数的列:

df.groupby(['revenue','session','user_id'])['revenue'].count()

将给出相同的答案。

pandas>=1.1:可用! 根据pandas 1.1,这将是我推荐的计算组中行数(即组大小)的方法。要为特定列计算组中非nan行的数量,请查看

旧的

新的[✓]

df.value_counts(subset=['A', 'B']) 
请注意,
size
count
不相同,前者统计每组的所有行,后者仅统计非空行。有关更多信息,请参阅


最小示例 将此输出与

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

演出 如果不对结果进行排序,速度也会更快:

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

只有当所有列都包含相同数量的非NA值时,这才是正确的。此答案不正确,您不能为“count”指定任何列,因为count()只计算非null值,不同的列可以有不同的nan计数。如果您要计算每个组中的行数,请改用(请参阅).从pandas 1.1开始,这是通过实现的,允许您避免分组步骤。当我将
子集
值_计数
一起使用并打印时,我会丢失列标题;知道为什么会这样吗?
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
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
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
%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)