统计dataframe列中出现的值的频率
我有一个数据集
|category| cat a cat b cat a
我希望能够返回像(显示唯一的值和频率)
category | freq | cat a 2 cat b 1
使用groupby
和count
:
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)]
在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()会更快。