【问题标题】:GroupBy Transformation on hierarchically indexed dataframe分层索引数据帧上的 GroupBy 转换
【发布时间】: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 必须为每个组返回一个标量值

知道可能是什么问题吗?

【问题讨论】:

    标签: python pandas


    【解决方案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
    

    【讨论】:

    • 是的,就是这样。谢谢!我不太明白为什么 transform 不起作用,但 apply 似乎更通用。
    猜你喜欢
    • 1970-01-01
    • 2015-01-02
    • 2016-03-04
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    相关资源
    最近更新 更多