我有一个数据集
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
当前回答
如果没有任何库,你可以这样做:
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}
其他回答
如果你想应用到所有列,你可以使用:
df.apply(pd.value_counts)
这将对每一列应用一个基于列的聚合函数(在本例中为value_counts)。
使用value_counts()作为@DSM注释。
In [37]:
df = pd.DataFrame({'a':list('abssbab')})
df['a'].value_counts()
Out[37]:
b 3
a 2
s 2
dtype: int64
还有groupby和count。在这里有很多方法可以剥猫皮。
In [38]:
df.groupby('a').count()
Out[38]:
a
a
a 2
b 3
s 2
[3 rows x 1 columns]
查看在线文档。
如果你想将频率添加回原始数据帧,使用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]
@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"])
计时器
%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
干杯!
正如大家所说,更快的解决方法是:
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
你也可以用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