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

yos*_*rry 251 python pandas

我有一个数据集

|category|
cat a
cat b
cat a
Run Code Online (Sandbox Code Playgroud)

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

category | freq |
cat a       2
cat b       1
Run Code Online (Sandbox Code Playgroud)

EdC*_*ica 346

使用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]
Run Code Online (Sandbox Code Playgroud)

请参阅在线文档: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
Run Code Online (Sandbox Code Playgroud)

如果要将频率添加回原始数据帧,请使用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]
Run Code Online (Sandbox Code Playgroud)

  • 在你的第一个代码示例中,df按预期分配,但是这一行:df.groupby('a').count()返回一个空数据帧.这个答案是否可能与熊猫0.18.1过时了?此外,您的列名"a"与您搜索"a"的值相同,这有点令人困惑.我会自己编辑,但由于代码对我不起作用,我不能确定我的编辑. (4认同)

Arr*_*ell 82

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

df.apply(pd.value_counts)
Run Code Online (Sandbox Code Playgroud)

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

  • 这是最简单的答案.这应该在顶部. (8认同)
  • 这个答案很简单但是(我相信)`apply`操作没有利用矢量化Numpy数组作为列提供的优势.因此,性能可能是较大数据集的问题. (3认同)

小智 45

df.category.value_counts()
Run Code Online (Sandbox Code Playgroud)

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

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

df['category'].value_counts()
Run Code Online (Sandbox Code Playgroud)

  • 如果列名称有空格,请使用**[]**.`df ['category 1'].value_counts()` (2认同)

Rom*_*kov 19

df.apply(pd.value_counts).fillna(0)
Run Code Online (Sandbox Code Playgroud)

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

apply - 计算每列的频率.如果设置axis = 1,则每行都会获得频率

fillna(0) - 使输出更加花哨.将NaN更改为0


Vid*_*a G 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]
Run Code Online (Sandbox Code Playgroud)

但是,使用size以下方法可以轻松确定唯一值及其频率:

>>> df.groupby('a').size()
a
a    2
b    3
s    2
Run Code Online (Sandbox Code Playgroud)

对于df.a.value_counts()排序值(按降序排列,即最大值为第一个),默认返回.


Lui*_*ipe 8

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

df.column_to_analyze.value_counts()
Run Code Online (Sandbox Code Playgroud)

但是,如果您想使用数据框中的输出,请使用以下架构:

df input:

category
cat a
cat b
cat a

df output: 

category   counts
cat a        2
cat b        1 
cat a        2
Run Code Online (Sandbox Code Playgroud)

你可以这样做:

df['counts'] = df.category.map(df.category.value_counts())
df 
Run Code Online (Sandbox Code Playgroud)


jet*_*com 5

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

[my_series[c].value_counts() for c in list(my_series.select_dtypes(include=['O']).columns)]
Run Code Online (Sandbox Code Playgroud)

/sf/answers/1973458441/


小智 5

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

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

例子:

to_frequency_table([1,1,1,1,2,3,4,4])
>>> {1: 4, 2: 1, 3: 1, 4: 2}
Run Code Online (Sandbox Code Playgroud)


use*_*666 5

如果您的DataFrame具有相同类型的值,则还可以return_counts=Truenumpy.unique()中进行设置。

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

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


tsa*_*ndo 5

您还可以通过首先将您的列作为类别广播来使用 pandas 来做到这一点,dtype="category"例如

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

df[cats] = df[cats].astype('category')
Run Code Online (Sandbox Code Playgroud)

然后调用describe

df[cats].describe()
Run Code Online (Sandbox Code Playgroud)

这将为您提供一个很好的值计数表以及更多:):

    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
Run Code Online (Sandbox Code Playgroud)