Pandas交叉表,但是来自第三列聚合的值

use*_*890 4 python aggregate pandas

这是我的问题:

df = pd.DataFrame({'A': ['one', 'one', 'two', 'two', 'one'] ,
                   'B': ['Ar', 'Br', 'Cr', 'Ar','Ar'] ,
                   'C': [1, 0, 0, 1,0 ]})
Run Code Online (Sandbox Code Playgroud)

我想生成类似pd.crosstab函数输出的东西,但是列和行的交集上的值应该来自第三列的聚合:

    Ar,  Br, Cr
one 0.5 0  0
two 1  0  0
Run Code Online (Sandbox Code Playgroud)

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

Max*_*axU 7

你可以使用pivot_table()方法,它使用aggfunc='mean'per-default:

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
Run Code Online (Sandbox Code Playgroud)


piR*_*red 6

我喜欢groupbyunstack

df.groupby(['A', 'B']).C.mean().unstack(fill_value=0)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明