计算一个级别在 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
我有一个带有集群的数据框。在此数据框中,我想计算特定值在集群中出现的次数。例如:
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