计算数据框列中值的出现频率

501 投票
16 回答
1205763 浏览
提问于 2025-04-17 22:13

我有一个数据集

category
cat a
cat b
cat a

我想得到类似下面这样的结果,显示每个独特值及其出现的频率

category   freq 
cat a       2
cat b       1

16 个回答

22

在0.18.1版本中,groupbycount一起使用时,无法得到唯一值的出现频率:

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

还有 groupbycount。这里有很多种方法可以实现同样的效果。

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]

撰写回答