Groupby.transform 在 dask 数据帧中不起作用

Groupby.transform doesn't work in dask dataframe

我正在使用以下 dask.dataframe AID:

   AID FID  ANumOfF
0    1   X        1
1    1   Y        5
2    2   Z        6
3    2   A        1
4    2   X       11
5    2   B       18

我知道在 pandas 数据框中我可以使用:

AID.groupby('AID')['ANumOfF'].transform('sum')

获得:

0     6
1     6
2    36
3    36
4    36
5    36

我想与 dask.dataframes 一起使用,它通常使用与 pandas 数据框相同的功能,但在这种情况下会出现以下错误:

AttributeError: 'SeriesGroupBy' object has no attribute 'transform'

这可能是以下两种情况之一,要么是 dask 不支持它,要么是因为我使用的是 python 3?

我尝试了以下代码:

AID.groupby('AID')['ANumOfF'].sum()

但这只是给我每个组的总和:

AID
1     6
2    36

我需要像上面那样在每一行中重复求和。我的问题是,如果不支持转换,是否有其他方法可以达到相同的结果?

我想你可以使用 join:

s = AID.groupby('AID')['ANumOfF'].sum()
AID = AID.set_index('AID').drop('ANumOfF', axis=1).join(s).reset_index()
print (AID)
   AID FID  ANumOfF
0    1   X        6
1    1   Y        6
2    2   Z       36
3    2   A       36
4    2   X       36
5    2   B       36

或通过聚合 Seriesdict:

使用 map 更快的解决方案
s = AID.groupby('AID')['ANumOfF'].sum()
#a bit faster
#s = AID.groupby('AID')['ANumOfF'].sum().to_dict()
AID['ANumOfF'] = AID['AID'].map(s)
print (AID)
   AID FID  ANumOfF
0    1   X        6
1    1   Y        6
2    2   Z       36
3    2   A       36
4    2   X       36
5    2   B       36

目前Dasksupports transform , howerver there may be an issues with indexes (depending on original dataframe). see this PR #5327

所以你的代码应该可以工作

AID.groupby('AID')['ANumOfF'].transform('sum')