gpt4 book ai didi

python - 分层索引数据帧上的 GroupBy 转换

转载 作者:太空宇宙 更新时间:2023-11-03 16:25:42 25 4
gpt4 key购买 nike

我想采用带有分层索引列的 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:转换必须为每个组返回一个标量值

知道问题可能是什么吗?

最佳答案

这就是你想要的吗?

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

关于python - 分层索引数据帧上的 GroupBy 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38000075/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com