Pandas交叉表,但使用第三列聚合的值

6
这是我的问题:
df = pd.DataFrame({'A': ['one', 'one', 'two', 'two', 'one'] ,
                   'B': ['Ar', 'Br', 'Cr', 'Ar','Ar'] ,
                   'C': [1, 0, 0, 1,0 ]})

我希望生成类似于pd.crosstab函数的输出,但是列和行交叉点上的值应该来自第三列的聚合结果:
    Ar,  Br, Cr
one 0.5 0  0
two 1  0  0

例如,对于'C'列中对应值为1和0的'one'和'Ar'两种情况,我们将'C'列中的值相加(0+1),并除以'C'列中的值的数量,因此我们得到(0+1)/2=0.5。当组合不存在时(例如'Cr'和'one'),我们将其设置为零。有什么想法吗?
2个回答

9

您可以使用 pivot_table() 方法,该方法默认使用aggfunc = 'mean'

In [46]: df.pivot_table(index='A', columns='B', values='C', fill_value=0)
Out[46]:
B     Ar  Br  Cr
A
one  0.5   0   0
two  1.0   0   0

你和piRSquared都提供了出色的答案!他们都是正确的答案,很难决定该给谁官方答案标签。我选择了piRSquared,因为他/她的排名略低于你的。希望你不介意。 - user1700890
1
@user1700890,这完全没问题!我也非常喜欢他的回答。实际上,pivot_table() 正是在幕后完成了这个任务(还有一些额外的操作)…… ;) - MaxU - stand with Ukraine

6

我喜欢使用 groupbyunstack

df.groupby(['A', 'B']).C.mean().unstack(fill_value=0)

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接