在不为每一列设置索引的情况下,将元素除以 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
我在 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