我有一个数据集
|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
使用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]
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)
Arr*_*ell 82
如果要应用于所有列,可以使用:
df.apply(pd.value_counts)
Run Code Online (Sandbox Code Playgroud)
这将对每个列应用基于列的聚合函数(在本例中为value_counts).
小智 45
df.category.value_counts()
Run Code Online (Sandbox Code Playgroud)
这一小段代码将为您提供所需的输出.
如果您的列名称包含空格,则可以使用
df['category'].value_counts()
Run Code Online (Sandbox Code Playgroud)
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()排序值(按降序排列,即最大值为第一个),默认返回.
正如大家所说,更快的解决方案是:
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)
对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)
小智 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)
如果您的DataFrame具有相同类型的值,则还可以return_counts=True在numpy.unique()中进行设置。
index, counts = np.unique(df.values,return_counts=True)
如果您的值是整数,则np.bincount()可能会更快。
您还可以通过首先将您的列作为类别广播来使用 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)