簡體   English   中英

統計一個值在 dataframe 列中出現的頻率

[英]Count the frequency that a value occurs in a dataframe column

我有一個數據集

category
cat a
cat b
cat a

我希望能夠返回類似(顯示唯一值和頻率)

category   freq 
cat a       2
cat b       1

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

查看在線文檔: https : //pandas.pydata.org/pandas-docs/stable/user_guide/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]

如果要應用於所有列,可以使用:

df.apply(pd.value_counts)

這會將基於列的聚合函數(在本例中為 value_counts)應用於每一列。

df.category.value_counts()

這短短的一小行代碼將為您提供所需的輸出。

如果您的列名有空格,您可以使用

df['category'].value_counts()
df.apply(pd.value_counts).fillna(0)

value_counts - 返回包含唯一值計數的對象

apply - 計算每列中的頻率。 如果你設置axis=1 ,你會得到每一行的頻率

fillna(0) - 使輸出更花哨。 將 NaN 更改為 0

在 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()排序值(按降序排列,即最大值在前)默認返回。

對 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

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

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

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

沒有任何庫,你可以這樣做:

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}

您也可以通過首先將您的列作為類別廣播來對dtype="category"執行此操作,例如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

@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

干杯!

我相信這適用於任何 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”檢查列名稱,然后檢查每個列值的唯一性。

以下代碼為名為“smaller_dat1”的數據幀中名為“Total_score”的列中的各種值創建頻率表,然后返回值“300”在該列中出現的次數。

valuec = smaller_dat1.Total_score.value_counts()
valuec.loc[300]
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)

使用此代碼:

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

|category|
cat a
cat b
cat a

解決方案:

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

正如大家所說,更快的解決方案是:

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 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM