统计dataframe列中出现的值的频率

我有一个数据集

|category| cat a cat b cat a 

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

 category | freq | cat a 2 cat b 1 

使用groupbycount

 In [37]: df = pd.DataFrame({'a':list('abssbab')}) df.groupby('a').count() Out[37]: a aa 2 b 3 s 2 [3 rows x 1 columns] 

请参阅在线文档: http : //pandas.pydata.org/pandas-docs/stable/groupby.html

还有@DSM的value_counts()已经评论过,许多方法在这里皮肤猫

 In [38]: df['a'].value_counts() Out[38]: b 3 a 2 s 2 dtype: int64 

如果您想要将频率添加回原始dataframe使用transform以返回alignment的索引:

 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) 

这将为每个列应用一个基于列的聚合函数(在这种情况下为value_counts)。

码:

 df = pd.DataFrame({'a':list('tuhimerisabhain')}) df.a.value_counts() >>> df.a.value_counts() i 3 h 2 a 2 n 1 b 1 m 1 r 1 t 1 e 1 u 1 s 1 

我会用这个pandasv0.19.2:

 df.category.value_counts() 
 df.apply(pd.value_counts).fillna(0) 

value_counts – 返回包含唯一值计数的对象

在每一列应用 – 计数频率。 如果你设置axis = 1,你可以在每一行得到frequncy

fillna(0) – 使输出更加花哨。 将NaN更改为0

在df中为多个列使用列表理解和value_counts

 [my_series[c].value_counts() for c in list(my_series.select_dtypes(include=['O']).columns)] 

https://stackoverflow.com/a/28192263/786326

在0.18.1组中,加上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()sorting值(按降序排列,即最大值在前)默认返回。

你也可以使用:

 df = pd.DataFrame({'a':list('abssbab')}) df['a'].value_counts() 

没有任何图书馆,你可以这样做:

 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.groupby('category').size() 

如果您的DataFrame具有相同types的值,则还可以在numpy.unique()中设置return_counts=True

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

如果你的值是整数, np.bincount()会更快。