平均分组

我有一个这样的数据框架:

cluster  org      time
1      a       8
1      a       6
2      h       34
1      c       23
2      d       74
3      w       6

我想计算每个组织每个集群的平均时间。

Expected result:

cluster mean(time)
1       15 #=((8 + 6) / 2 + 23) / 2
2       54 #=(74 + 34) / 2
3       6

我不知道如何做到这一点在熊猫,有人可以帮助吗?

359645 次浏览

If you want to first take mean on the combination of ['cluster', 'org'] and then take mean on cluster groups, you can use:

In [59]: (df.groupby(['cluster', 'org'], as_index=False).mean()
.groupby('cluster')['time'].mean())
Out[59]:
cluster
1          15
2          54
3           6
Name: time, dtype: int64

如果你只想要 cluster组的平均值,那么你可以使用:

In [58]: df.groupby(['cluster']).mean()
Out[58]:
time
cluster
1        12.333333
2        54.000000
3         6.000000

你也可以在 ['cluster', 'org']上使用 groupby,然后使用 mean():

In [57]: df.groupby(['cluster', 'org']).mean()
Out[57]:
time
cluster org
1       a    438886
c        23
2       d      9874
h        34
3       w         6

我会简单地这样做,这完全符合你想要的逻辑:

df.groupby(['org']).mean().groupby(['cluster']).mean()

另一种可能的解决方案是使用 pivot_table()重塑数据帧,然后取 mean()。请注意,必须通过 aggfunc='mean'(这是 clusterorgtime的平均值)。

df.pivot_table(index='org', columns='cluster', values='time', aggfunc='mean').mean()

另一种可能是在第一个 groupby()之后使用 mean()level参数来聚合:

df.groupby(['cluster', 'org']).mean().mean(level='cluster')