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

时间:2014-03-13 21:34:41

标签: python pandas

我有一个数据集

|category|
cat a
cat b
cat a

我希望能够返回类似的内容(显示独特的值和频率)

category | freq |
cat a       2
cat b       1

19 个答案:

答案 0 :(得分:284)

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

答案 1 :(得分:73)

如果您想申请所有可以使用的栏目:

df.apply(pd.value_counts)

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

答案 2 :(得分:36)

df.category.value_counts()

这一小段代码将为您提供所需的输出。

如果您的列名称包含空格,则可以使用

df['category'].value_counts()

答案 3 :(得分:16)

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

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

apply - 计算每列的频率。如果您设置axis=1,则会在每一行中获得频率

fillna(0) - 让输出更加花哨。将NaN更改为0

答案 4 :(得分:14)

在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()个排序值(按降序排列,即最大值)。

答案 5 :(得分:5)

对df中的多列使用list comprehension和value_counts

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

https://stackoverflow.com/a/28192263/786326

答案 6 :(得分:5)

这应该有效:

df.groupby('category').size()

答案 7 :(得分:4)

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

index, counts = np.unique(df.values,return_counts=True)

如果你的值是整数,那么

np.bincount()会更快。

答案 8 :(得分:3)

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

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}

答案 9 :(得分:2)

使用size()方法:

    import pandas as pd
    print df.groupby['category'].size()
    #where df is your dataframe

答案 10 :(得分: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

答案 11 :(得分: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)

答案 12 :(得分: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

干杯!

答案 13 :(得分:0)

使用此代码:

import numpy as np
np.unique(df['a'],return_counts=True)

答案 14 :(得分:0)

gl.enable(gl.DEPTH_TEST); // enabled by default, but let's be SURE.
gl.clearDepth(0.0);       // each time we 'clear' our depth buffer, set all
                          // pixel depths to 0.0  (1.0 is DEFAULT)
gl.depthFunc(gl.GREATER); // gl.LESS is DEFAULT; reverse it!
                          // draw a pixel only if its depth value is GREATER
                          // than the depth buffer's stored value.

解决方案:

your data:

|category|
cat a
cat b
cat a

答案 15 :(得分:0)

df.category.value_counts()-这是计算的最简单方法

答案 16 :(得分: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”检查列名称,然后检查每个列值的唯一性。

答案 17 :(得分:0)

以下代码为名为“smaller_dat1”的数据帧中名为“Total_score”的列中的各种值创建频率表,然后返回值“300”在该列中出现的次数。

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

答案 18 :(得分:0)

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

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