【发布时间】:2014-04-18 22:38:36
【问题描述】:
我有一个数据集
category
cat a
cat b
cat a
我希望能够返回类似(显示唯一值和频率)
category freq
cat a 2
cat b 1
【问题讨论】:
我有一个数据集
category
cat a
cat b
cat a
我希望能够返回类似(显示唯一值和频率)
category freq
cat a 2
cat b 1
【问题讨论】:
正如大家所说,更快的解决方案是:
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
【讨论】:
以下代码在名为“smaller_dat1”的数据框中为名为“Total_score”的列中的各种值创建频率表,然后返回值“300”在列中出现的次数。
valuec = smaller_dat1.Total_score.value_counts()
valuec.loc[300]
【讨论】:
使用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]
查看在线文档: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).fillna(0)
value_counts - 返回包含唯一值计数的对象
apply - 每列的计数频率。如果你设置axis=1,你会得到每一行的频率
fillna(0) - 使输出更花哨。将 NaN 更改为 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”检查列名,然后检查每个列值的唯一性。
【讨论】:
your data:
|category|
cat a
cat b
cat a
解决方案:
df['freq'] = df.groupby('category')['category'].transform('count')
df = df.drop_duplicates()
【讨论】:
df.category.value_counts()
这行简短的代码将为您提供所需的输出。
如果你的列名有空格,你可以使用
df['category'].value_counts()
【讨论】:
df['category 1'].value_counts()
@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
干杯!
【讨论】:
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)
【讨论】:
您也可以通过首先将您的列广播为类别来对 pandas 进行此操作,例如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
【讨论】:
如果你的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}
【讨论】:
在 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_counts() 排序后的值(按降序,即最大值在前)。
【讨论】:
如果你想应用到你可以使用的所有列:
df.apply(pd.value_counts)
这将对每个列应用基于列的聚合函数(在本例中为 value_counts)。
【讨论】:
对 df 中的多个列使用列表理解和 value_counts
[my_series[c].value_counts() for c in list(my_series.select_dtypes(include=['O']).columns)]
【讨论】: