我有一个数据集

category
cat a
cat b
cat a

我希望能够返回(显示唯一值和频率)

category   freq 
cat a       2
cat b       1

当前回答

你也可以用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

其他回答

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

在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有相同类型的值,你也可以在numpy.unique()中设置return_counts=True。

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

如果您的值是整数,则Np.bincount()可能更快。

我相信这应该工作的任何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”检查列名,然后检查每个列值的唯一性。

如果你想应用到所有列,你可以使用:

df.apply(pd.value_counts)

这将对每一列应用一个基于列的聚合函数(在本例中为value_counts)。