我有一个数据集
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
当前回答
在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]
然而,唯一的值和它们的频率很容易通过大小来确定:
>>> df.groupby('a').size()
a
a 2
b 3
s 2
使用df.a.value_counts(),默认情况下返回排序后的值(降序排列,即最大值在前)。
其他回答
我相信这应该工作的任何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”检查列名,然后检查每个列值的唯一性。
使用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]
如果你的DataFrame有相同类型的值,你也可以在numpy.unique()中设置return_counts=True。
index, counts= np.unique(df.values,return_counts=True)
如果您的值是整数,则Np.bincount()可能更快。
如果你想应用到所有列,你可以使用:
df.apply(pd.value_counts)
这将对每一列应用一个基于列的聚合函数(在本例中为value_counts)。
@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
干杯!