我有一个数据集

category
cat a
cat b
cat a

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

category   freq 
cat a       2
cat b       1

当前回答

your data:

|category|
cat a
cat b
cat a

解决方案:

 df['freq'] = df.groupby('category')['category'].transform('count')
 df =  df.drop_duplicates()

其他回答

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

df.apply(pd.value_counts)

这将对每一列应用一个基于列的聚合函数(在本例中为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}
your data:

|category|
cat a
cat b
cat a

解决方案:

 df['freq'] = df.groupby('category')['category'].transform('count')
 df =  df.drop_duplicates()
df.apply(pd.value_counts).fillna(0)

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

在每一列中应用计数频率。如果你设置axis=1,你会得到每一行的频率

Fillna(0) -使输出更花哨。更改NaN为0

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