【发布时间】:2016-06-24 03:35:16
【问题描述】:
我想使用带有分层索引列的 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 必须为每个组返回一个标量值
知道可能是什么问题吗?
【问题讨论】: