计算一个级别在 Python 数据帧中的 cluster/group 中出现的次数

Count number of times a level occurs within a cluster/group in Python dataframe

我有一个带有集群的数据框。在此数据框中,我想计算特定值在集群中出现的次数。例如:

data = {'cluster':['1001', '1001', '1001', '1002', '1002', '1002'],
        'attribute':['1', '2', '1', '1', '2', '2']}

df = pd.DataFrame(data)

df

我想计算每个簇内出现“1”的次数。我试过使用 lambda 函数,虽然尝试在集群内进行平均,但计数不起作用。

为了平均,我使用了:

df['newcol'] = df.groupby('cluster')['attribute'].transform(lambda x: x.mean())
df

使用相同的方法,但将平均值替换为计数:

df['newcol'] = df.groupby('cluster')['attribute'].transform(lambda x: x.count('2'))
df

给我这个错误:

Error: 'Requested level (3) does not match index name (None)'

理想情况下,我想将计数添加为附加列,因此我正在使用 lambda 函数。

请帮我解决这个问题!如果需要任何其他详细信息或者我不清楚,我很乐意添加信息!

编辑

谢谢,@Rutger 提供了我要找的东西。在要点中,我希望创建一个新列来显示该属性在一个集群中出现了多少次。我还需要它具有泛化性,以便可以计算所有属性。

另外,我的数据框包含大约 600,000 行。是否有推荐的方法可以从这个数据集中取出一块,以便我可以在上面做我的工作?如果其他地方有类似的答案,请指出我的答案!谢谢!

有很多方法可以做到这一点。我会用两列进行分组,然后你就可以看到它们出现的频率。这不是我假设的最直接的方法,但我认为这是您正在寻找的结果。

df['count'] = df.set_index(['cluster', 'attribute']).index.map(df.groupby(['cluster', 'attribute']).size())

由于您想在现有列旁边添加一列以显示集群(组)中 1's 的数量,因此您可以像现在一样继续使用 .transform()

.transform()中,可以使用lambda函数来检查元素等于'1'并得到这样的True条目的sum()(而不是计数),如下:

df['newcol'] = df.groupby('cluster')['attribute'].transform(lambda x: x.eq('1').sum())

结果:

print(df)


  cluster attribute   newcol
0    1001         1        2
1    1001         2        2
2    1001         1        2
3    1002         1        1
4    1002         2        1
5    1002         2        1