【问题标题】:Groupby.transform doesn't work in dask dataframeGroupby.transform 在 dask 数据帧中不起作用
【发布时间】:2017-04-04 12:56:52
【问题描述】:

我正在使用以下 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

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

【问题讨论】:

  • 嗨 Ed,在链接中它说上面的内容应该适用于你有两列,而我确实有两列,它确实适用于 pandas 数据框。我的问题是我有一个 dask 数据框,它似乎不支持转换。有没有办法在不使用变换的情况下实现变换?
  • 我没有使用 dask dfs 的经验,这行得通吗:AID.groupby('AID')[['ANumOfF']].transform('sum')?这在熊猫土地上将强制调用单列 df
  • 截至 2017 年 4 月,Dask.dataframe groupby 对象不支持 transform 方法。您可能想raise an issue 请求它。
  • EdChum,这适用于熊猫数据框是的。但是我的数据太大了,我无法使用 pandas,因此已切换到 dask。

标签: python python-3.x pandas dataframe dask


【解决方案1】:

我觉得你可以用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通过聚合Seriesdict更快的解决方案:

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

【讨论】:

  • 您知道如何将结果映射回多列分组的数据框吗?如果您认为合适,我很乐意将此作为另一个问题提出。
【解决方案2】:

目前 Dask supports transform ,但是索引可能存在问题(取决于原始数据框)。 see this PR #5327

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

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

【讨论】:

    猜你喜欢
    • 2018-03-20
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多