我有一个包含三列的数据框:A,B,C。假设A和B是从0到10的整数序列。我想创建一个新的数据框,其中唯一A的值是索引,B的唯一值是列,每个单元格是在Ai,Cj的交叉点获得的平均值C.
例如,如果我们将数据帧分组如下:
Cvalues = df.groupby(['A','B'],as_index=False).mean()
在数据框的(i,j)位置我想创建那里:
Cvalues.loc[Cvalues.A==i].loc[Cvalues.B==j].C
最简单的方法是什么?
答案 0 :(得分:1)
你快到了。您可以pivot
Cvalues
,或者更好,直接转到pivot_table
并使用其aggfunc
的内置选项。
df = pd.DataFrame({'A':[2,0,1,1,2,0,1,0],
'B':[1,2,1,0,1,2,1,1],
'C':[10,20,30,40,50,60,70,80]})
推荐的One-Liner:
res = df.pivot_table(index='A', columns='B', values='C', aggfunc='mean')
让您的方法有效:
Cvalues = df.groupby(['A','B'],as_index=False).mean()
res = Cvalues.pivot(index='A', columns='B', values='C')
为什么要这么麻烦,但为了以防万一,你可以把它变得更紧凑:
res = df.groupby(['A','B'],as_index=False).mean().pivot(index='A', columns='B', values='C')
这是两种方式的结果:
B 0 1 2
A
0 NaN 80.0 40.0
1 40.0 50.0 NaN
2 NaN 30.0 NaN
其中,位于A=2 and B=1
:30.0 = (10 + 50)/2