GroupBy对分层索引数据框的转换

时间:2016-06-23 19:20:24

标签: python pandas

我想将带有分层索引列的Pandas数据帧和规范化值,使得具有相同外部索引的值总和为1。例如:

cols = pd.MultiIndex.from_tuples([('A', 1), ('A', 2), ('B', 1), ('B', 2)])
X = pd.DataFrame(np.arange(20).reshape(5,4), columns=cols)

给出一个数据帧X:

    A       B
    1   2   1   2
0   0   1   2   3
1   4   5   6   7
2   8   9   10  11
3   12  13  14  15
4   16  17  18  19

我想规范化行,使A列总和为1,B列总和为1。生成:

    A                       B
    1           2           1           2
0   0.000000    1.000000    0.400000    0.600000
1   0.444444    0.555556    0.461538    0.538462
2   0.470588    0.529412    0.476190    0.523810
3   0.480000    0.520000    0.482759    0.517241
4   0.484848    0.515152    0.486486    0.513514

以下for循环有效:

res = []
for (k,g) in X.groupby(axis=1, level=0):
    g = g.div(g.sum(axis=1), axis=0)
    res.append(g)
res = pd.concat(res, axis=1)

但是一个班轮失败了:

X.groupby(axis=1, level=0).transform(lambda x: x.div(x.sum(axis=1), axis=0)) 

显示错误消息:

ValueError:transform必须为每个组返回一个标量值

知道问题可能是什么?

1 个答案:

答案 0 :(得分:1)

是你想要的吗?

In [33]: X.groupby(level=0, axis=1).apply(lambda x: x.div(x.sum(axis=1), axis=0))
Out[33]:
          A                   B
          1         2         1         2
0  0.000000  1.000000  0.400000  0.600000
1  0.444444  0.555556  0.461538  0.538462
2  0.470588  0.529412  0.476190  0.523810
3  0.480000  0.520000  0.482759  0.517241
4  0.484848  0.515152  0.486486  0.513514