在不为每一列设置索引的情况下,将元素除以 dask 中的 groupby 之和

Divide element by sum of groupby in dask without setting index for every column

我在 pandas 中实现了代码,但我无法转换为 dask,因为我需要使用 set_index(),最好的解决方法是什么?使用 dask 是因为我需要将其扩展到更大的数据帧。

我正在寻找 return 一个数据框,其中每个元素除以一组的按列总和。 看起来像这样的示例数据框

df = [
    [1,4,2,1],
    [4,4,0,-1],
    [2,3,1,6],
    [-2,1,0,-1],
    [6,-3,-2,-1],
    [1,0,5,5],
]
df = pd.DataFrame(df)
lab_id = ['a','b','a','b','a','c']
df['lab_id'] = lab_id
df

    0    1    2    3    lab_id 
0   1    4    2    1    a
1   4    4    0   -1    b
2   2    3    1    6    a
3  -2    1    0   -1    b
4   6   -3   -2   -1    a
5   1    0    5    5    c

目前在 pandas 我对 return 数据框进行了分组:

sum_df = df.groupby('lab_id').sum()
sum_df

       0    1   2   3
lab_id              
a      9    4   1   6
b      2    5   0   -2
c      1    0   5   5

然后我设置原始数据帧的索引并除以总和数据帧:

df.set_index('lab_id')/sum_df


           0    1        2      3
lab_id              
a   0.111111    1.00     2.0    0.166667
a   0.222222    0.75     1.0    1.000000
a   0.666667    -0.75    -2.0   -0.166667
b   2.000000    0.80     NaN    0.500000
b   -1.000000   0.20     NaN    0.500000
c   1.000000    NaN      1.0    1.000000

主要问题是我在 dask 中设置索引时遇到了一个很大的问题,它明确提到要避免使用 set_index()reset_index() 方法。我实在找不到解决办法!

我尝试了很多神秘的方法来在 dask 之外设置索引,例如创建一个已经设置了索引的新数据框和一行虚拟数据,并迭代地分配旧数据框中的列(这是最糟糕的一些我写的代码)。

试试 transform

df.loc[:,[0,1,2,3]] = df/df.groupby('lab_id').transform('sum')[[0,1,2,3]]
df
Out[767]: 
          0     1    2         3 lab_id
0  0.111111  1.00  2.0  0.166667      a
1  2.000000  0.80  NaN  0.500000      b
2  0.222222  0.75  1.0  1.000000      a
3 -1.000000  0.20  NaN  0.500000      b
4  0.666667 -0.75 -2.0 -0.166667      a
5  1.000000   NaN  1.0  1.000000      c