Pandas:创建一个将列与其他两列相关联的数据框

时间:2017-12-30 09:38:08

标签: python pandas numpy

我有一个包含三列的数据框: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

最简单的方法是什么?

1 个答案:

答案 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=130.0 = (10 + 50)/2

的交叉点