计算数据框列中值的出现频率
我有一个数据集
category
cat a
cat b
cat a
我想得到类似下面这样的结果,显示每个独特值及其出现的频率
category freq
cat a 2
cat b 1
16 个回答
22
在0.18.1版本中,groupby
和count
一起使用时,无法得到唯一值的出现频率:
>>> df
a
0 a
1 b
2 s
3 s
4 b
5 a
6 b
>>> df.groupby('a').count()
Empty DataFrame
Columns: []
Index: [a, b, s]
不过,我们可以很简单地用size
来找出唯一值及其出现的次数:
>>> df.groupby('a').size()
a
a 2
b 3
s 2
使用df.a.value_counts()
时,默认会返回按出现次数从大到小排序的值,也就是说,出现次数最多的值会排在最前面。
24
df.apply(pd.value_counts).fillna(0)
value_counts - 这个功能可以告诉你每个不同值出现了多少次。
apply - 这个功能可以计算每一列中值出现的频率。如果你设置 axis=1
,那么它会计算每一行中值出现的频率。
fillna(0) - 这个功能可以让输出看起来更好。它把缺失的值(NaN)替换成了0。
108
df.category.value_counts()
这一行简短的代码会给你想要的结果。
如果你的列名中有空格,你可以使用
df['category'].value_counts()
126
如果你想对所有的列都进行操作,可以使用:
df.apply(pd.value_counts)
这样做会对每一列应用一个聚合函数(在这个例子中是计算每个值出现的次数)。
675
可以使用 value_counts()
,正如@DSM所提到的。
In [37]:
df = pd.DataFrame({'a':list('abssbab')})
df['a'].value_counts()
Out[37]:
b 3
a 2
s 2
dtype: int64
还有 groupby
和 count
。这里有很多种方法可以实现同样的效果。
In [38]:
df.groupby('a').count()
Out[38]:
a
a
a 2
b 3
s 2
[3 rows x 1 columns]
可以查看 在线文档。
如果你想把频率信息加回到原来的数据表中,可以使用 transform
来返回一个对齐的索引:
In [41]:
df['freq'] = df.groupby('a')['a'].transform('count')
df
Out[41]:
a freq
0 a 2
1 b 3
2 s 2
3 s 2
4 b 3
5 a 2
6 b 3
[7 rows x 2 columns]