计算一个值在数据帧列中出现的频率

我有一个数据集

category
cat a
cat b
cat a

我希望能够返回(显示唯一值和频率)

category   freq
cat a       2
cat b       1
1068392 次浏览

使用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]

对df中的多个列使用列表理解和value_counts

[my_series[c].value_counts() for c in list(my_series.select_dtypes(include=['O']).columns)]

https://stackoverflow.com/a/28192263/786326 < a href = " https://stackoverflow.com/a/28192263/786326 " > < / >

如果你想应用到所有列,你可以使用:

df.apply(pd.value_counts)

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

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

如果没有任何库,你可以这样做:

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}
df.apply(pd.value_counts).fillna(0)

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

应用计数每列的频率。如果你设置axis=1,你会得到每行的频率

Fillna(0) -使输出更花哨。更改NaN为0

如果你的DataFrame有相同类型的值,你也可以在numpy.unique ()中设置return_counts=True

index, counts= np.unique(df.values,return_counts=True) < /代码> < / p >

如果您的值是整数,np.bincount ()可能更快。

df.category.value_counts()

这一小行代码将提供您想要的输出。

如果列名中有空格,则可以使用

df['category'].value_counts()

你也可以通过首先将列作为类别广播来实现这一点,例如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
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)

@metatoaster已经指出这一点。 选择Counter。它的速度非常快。< / p >

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

干杯!

your data:


|category|
cat a
cat b
cat a

解决方案:

 df['freq'] = df.groupby('category')['category'].transform('count')
df =  df.drop_duplicates()

我相信这应该工作的任何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”检查列名,然后检查每个列值的唯一性。

下面的代码为一个名为“total_score”的列中的各种值创建频率表;在一个名为“smaller_dat1”的数据框架中,然后返回值“300”的次数;显示在列中。

valuec = smaller_dat1.Total_score.value_counts()
valuec.loc[300]

正如大家所说,更快的解决方法是:

df.column_to_analyze.value_counts()

但是如果你想在你的数据框架中使用输出,使用这个模式:

df input:


category
cat a
cat b
cat a


df output:


category   counts
cat a        2
cat b        1
cat a        2

你可以这样做:

df['counts'] = df.category.map(df.category.value_counts())
df