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

Python 计算数据帧列中出现值的频率,python,pandas,frequency,Python,Pandas,Frequency,我有一个数据集 category cat a cat b cat a 我希望能够返回如下内容(显示唯一值和频率) 使用groupby和count: 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] 请参阅在线文档: 正如@DSM所评论的,这里有很多剥猫皮的方法 In [38]: d

我有一个数据集

category
cat a
cat b
cat a
我希望能够返回如下内容(显示唯一值和频率)


使用
groupby
count

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]
请参阅在线文档:

正如@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]

对df中的多个列使用列表理解和值_计数

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

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

df.apply(pd.value_counts)

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

在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\u 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}
-返回包含唯一值计数的对象

-计算每列中的频率。如果将轴设置为1,则每行都会显示频率


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

如果您的数据帧具有相同类型的值,您还可以在中设置
return\u counts=True

index,counts=np.unique(df.values,return\u counts=True)

如果您的值是整数,则速度可能会更快

df.category.value_counts()
这一小行代码将为您提供所需的输出

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

df['category'].value_counts()

您也可以通过首先将您的专栏作为类别广播来实现这一点,例如
dtype=“category”
e.g

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

df[cats] = df[cats].astype('category')
然后调用
描述

df[cats].describe()
这将为您提供一个很好的值计数表和更多信息:):

第一个唯一值计数

n_at_most_50k = n_values[0]
n_greater_50k = n_values[1]

n_values
第二个唯一值计数

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已经指出了这一点。 转到
计数器
。它燃烧得很快

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"])
计时器 干杯

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”检查列名称,然后检查每个列值的唯一性。

是否查找?如果列名有空格,则使用[]
df['category 1'].value_counts()
您可以添加代码工作原理的简要说明,以改进答案。
your data:

|category|
cat a
cat b
cat a
 df['freq'] = df.groupby('category')['category'].transform('count')
 df =  df.drop_duplicates()
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"})