【问题标题】:`.iloc()` returns strange results when used with dask dataframe groupby`.iloc()` 与 dask 数据帧 groupby 一起使用时返回奇怪的结果
【发布时间】:2019-11-23 13:02:33
【问题描述】:

我有一个包含 3 列的大型数据集:

   sku   center units
0   103896  1   2.0
1   103896  1   0.0
2   103896  1   5.0
3   103896  1   0.0
4   103896  1   7.0
5   103896  1   0

我需要使用groupby-apply

def function_a(x):
    return np.sum((x > 0).iloc[::-1].cumsum() == 0)

def function_b(x):
    return x.eq(0).sum()/((x.eq(0)&x.shift().ne(0)).sum())

使用 dask (df.groupby(['sku', 'center'])['units'].apply(function_a), meta=(float)),我在应用第一个函数时遇到很多问题,因为 dask 不支持索引操作 (.iloc),结果完全错误。

是否可以使用 pyspark UDF 应用这些功能?

【问题讨论】:

  • 您可以使用与pandas_udf GROUPED_AGG相同的功能
  • 在使用 dask 时,如何确保按元素分组的行已排序?因为'units' 的行/条目的不同顺序会给您在.cumsum() 上的不同结果?
  • 每个组 ['sku', 'center'] 都按日期降序排列。但是当我使用 iloc 函数时,它似乎会随机播放。

标签: python pandas pandas-groupby dask


【解决方案1】:

假设

您的索引(在上面的示例中为 (0, 1, 2, 3, 4, 5))对应于您想要的正确排序。例如。通过数据是 CSV 格式的

0,103896,1,2.0
1,103896,1,0.0
2,103896,1,5.0

其中第一列对应于样本编号。然后,当您使用以下命令读取数据时:

import dask.dataframe as dd
df = dd.read_csv('path/to/data_*.csv', header=None)
df.columns = ['id', 'sku', 'center', 'units']
df = df.set_index('id')

这为您提供了一个确定性的 DataFrame。这意味着数据的索引是相同的,无论从驱动器中读取数据的顺序是什么。

.iloc()问题的解决方案

然后您可以将function_a(x): 更改为:

def function_a(x):
    return np.sum((x.sort_index(ascending=False) > 0).cumsum() == 0)

现在应该可以使用

df.groupby(['sku', 'center'])['units'].apply(function_a, meta=(float))

【讨论】:

    猜你喜欢
    • 2021-03-25
    • 2022-08-06
    • 2012-08-08
    • 2012-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多