Pandas、分组并计数
Pandas, groupby and count
我有一个这样的数据框
>>> 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的每个值代表一种类型,我想统计每种类型的数量说user_id=a
的revenue=-1
和session=4
的数量是1.
而且我发现简单的调用count()
函数后groupby()
无法输出我想要的结果
>>> 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()
和
df.groupby(['revenue','session','user_id'])['session'].count()
会给出相同的答案。
pandas >= 1.1: df.value_counts
可用!
从 pandas 1.1 开始,这将是我推荐的计算组中行数(即组大小)的方法。要计算特定列 组中非 nan 行的数量 ,请查看 .
旧
df.groupby(['A', 'B']).size() # df.groupby(['A', 'B'])['C'].count()
新建[✓]
df.value_counts(subset=['A', 'B'])
注意size
和count
并不相同,前者统计每组的所有行,后者只统计非空行。有关更多信息,请参阅 。
最小示例
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)
我有一个这样的数据框
>>> 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的每个值代表一种类型,我想统计每种类型的数量说user_id=a
的revenue=-1
和session=4
的数量是1.
而且我发现简单的调用count()
函数后groupby()
无法输出我想要的结果
>>> 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()
和
df.groupby(['revenue','session','user_id'])['session'].count()
会给出相同的答案。
pandas >= 1.1: df.value_counts
可用!
从 pandas 1.1 开始,这将是我推荐的计算组中行数(即组大小)的方法。要计算特定列 组中非 nan 行的数量 ,请查看
旧
df.groupby(['A', 'B']).size() # df.groupby(['A', 'B'])['C'].count()
新建[✓]
df.value_counts(subset=['A', 'B'])
注意size
和count
并不相同,前者统计每组的所有行,后者只统计非空行。有关更多信息,请参阅
最小示例
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)