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


311

我有一个数据集

|category|
cat a
cat b
cat a

我希望能够返回类似的信息(显示唯一的值和频率)

category | freq |
cat a       2
cat b       1


93

当使用“ df [” category“]。value_counts()”时,它说是int吗?但是它返回列名作为索引?它是数据框对象还是以某种方式将系列(计数)和原始唯一列值组合在一起?
yoshiserry

@yoshiserry这是熊猫系列的作品type(df['category'].value_counts()),它会这么说
EdChum 2014年

我做到了,对此我感到很惊讶,但是我想得越多,它就越有意义。完成此操作后,值将计入某些列,我想排除一些行。我知道如何删除列,但如何排除行?
yoshiserry

Answers:


412

使用groupbycount

In [37]:
df = pd.DataFrame({'a':list('abssbab')})
df.groupby('a').count()

Out[37]:

   a
a   
a  2
b  3
s  2

[3 rows x 1 columns]

请参阅在线文档:http : //pandas.pydata.org/pandas-docs/stable/groupby.html

另外,value_counts()正如@DSM所说,这里有很多方法可以给猫皮

In [38]:
df['a'].value_counts()

Out[38]:

b    3
a    2
s    2
dtype: int64

如果您想将频率添加回原始数据帧,请使用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]

@yoshiserry不,您看到的是它创建了一个与原始数据框对齐的序列,这与其他显示唯一值及其频率的方法不同,如果您只想将频率计数添加回数据框,则可以使用transform这个。这只是另一种技术,您会注意到在分配回去之后它没有折叠数据框,并且没有缺失值。我还认为数据帧始终具有索引,我认为您无法摆脱它,只能重置它,分配一个新索引或将列用作索引
EdChum 2014年

4
在您的第一个代码示例中,按预期分配了df,但是此行:df.groupby('a')。count()返回一个空的数据帧。熊猫0.18.1是否有可能已经过时?另外,您的列名“ a”与您要搜索的“ a”的值相同也有些令人困惑。我会自己编辑它,但是由于代码对我不起作用,所以我不确定自己所做的编辑。
Alex

1
@Alex,您是正确的,它似乎在最新版本中不再起作用,对我来说似乎是个错误,因为我不明白为什么不这样做
EdChum

1
为什么不使用df.['a'].value_counts().reset_index()代替df.groupby('a')['a'].transform('count')
串联

1
@tandem,它们做不同的事情,调用value_counts会生成一个频率计数,如果您想将结果作为原始df的新列添加回去,则必须使用transform我的答案中所详述的。
EdChum

93

如果要应用于所有列,可以使用:

df.apply(pd.value_counts)

这会将基于列的聚合函数(在本例中为value_counts)应用于每个列。


10
这是最简单的答案。这应该在顶部。
杰弗里·何塞

4
这个答案很简单,但是(我相信)该apply操作没有利用列提供的矢量化Numpy数组的优势。结果,对于较大的数据集,性能可能会成为问题。
kuanb


19
df.apply(pd.value_counts).fillna(0)

value_counts-返回包含唯一值计数的对象

适用 -计算每列中的频率。如果设置axis=1,则每一行都有频率

fillna(0)-使输出更加精美。将NaN更改为0


1
当计算同一行中各列的值出现次数时,此功能非常强大!!
amc

14

在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()排序的值(按降序排列,即最大价值第一)默认情况下返回。




4

没有任何库,您可以改为执行以下操作:

def to_frequency_table(data):
    frequencytable = {}
    for key in data:
        if key in frequencytable:
            frequencytable[key] += 1
        else:
            frequencytable[key] = 1
    return frequencytable

例:

to_frequency_table([1,1,1,1,2,3,4,4])
>>> {1: 4, 2: 1, 3: 1, 4: 2}

1

您也可以对熊猫进行操作,方法是首先将列作为类别广播,dtype="category"例如

cats = ['client', 'hotel', 'currency', 'ota', 'user_country']

df[cats] = df[cats].astype('category')

然后致电describe

df[cats].describe()

这将为您提供一个不错的值计数表,以及更多:):

    client  hotel   currency    ota user_country
count   852845  852845  852845  852845  852845
unique  2554    17477   132 14  219
top 2198    13202   USD Hades   US
freq    102562  8847    516500  242734  340992

0
n_values = data.income.value_counts()

第一个唯一值计数

n_at_most_50k = n_values[0]

第二个唯一值计数

n_greater_50k = n_values[1]

n_values

输出:

<=50K    34014
>50K     11208

Name: income, dtype: int64

输出:

n_greater_50k,n_at_most_50k:-
(11208, 34014)

0

@metatoaster已经指出了这一点。去吧Counter。快速燃烧。

import pandas as pd
from collections import Counter
import timeit
import numpy as np

df = pd.DataFrame(np.random.randint(1, 10000, (100, 2)), columns=["NumA", "NumB"])

计时器

%timeit -n 10000 df['NumA'].value_counts()
# 10000 loops, best of 3: 715 µs per loop

%timeit -n 10000 df['NumA'].value_counts().to_dict()
# 10000 loops, best of 3: 796 µs per loop

%timeit -n 10000 Counter(df['NumA'])
# 10000 loops, best of 3: 74 µs per loop

%timeit -n 10000 df.groupby(['NumA']).count()
# 10000 loops, best of 3: 1.29 ms per loop

干杯!




0

我相信这对于任何DataFrame列列表都可以正常工作。

def column_list(x):
    column_list_df = []
    for col_name in x.columns:
        y = col_name, len(x[col_name].unique())
        column_list_df.append(y)
return pd.DataFrame(column_list_df)

column_list_df.rename(columns={0: "Feature", 1: "Value_count"})

函数“ column_list”检查列名称,然后检查每个列值的唯一性。


您可以添加有关代码如何工作以改善答案的简短说明。
DobromirM
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.