我正在使用以下 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
或使用 map
更快的解决方案通过聚合 Series
或 dict
:
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
关于python - Groupby.transform 在 dask 数据帧中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43207926/