【问题标题】:Dask groupby apply behaving wierdlyDask groupby 申请行为怪异
【发布时间】:2017-09-19 18:56:08
【问题描述】:

我正在尝试为这个测试示例运行 groupby apply in dask

import pandas as pd
import dask.dataframe as dd
tdf = pd.DataFrame({'a': [1, 2, 3, 4, 5, 6, 7, 8, 9],
               'b': [4, 5, 6, 3, 2, 1, 0, 0, 0]},
              index=[0, 1, 3, 5, 6, 8, 9, 9, 9])
ddf = dd.from_pandas(tdf, npartitions=3)

def func(df):
    df['b'] = df.b - df.b.mean()
    return df

meta = tdf.groupby('a').apply(func)
rddf = ddf.groupby('a').apply(func,meta=tmeta).compute()

我在 windows 上的 jupyter notebook anaconda python_version = 3.6 中执行此代码,我收到错误 'ValueError: cannot reindex from a duplicate axis' 并且只重复执行代码的rddf部分,我得到了

a   b
6   5   0.0
9   9   0.0
0   1   0.0
1   2   0.0
8   6   0.0
9   7   0.0
9   8   0.0
3   3   0.0
5   4   0.0

为什么会这样,相同的代码,不同的结果?

【问题讨论】:

  • 不可能通过tdf = tdf.reset_index(drop=True)创建默认非重复索引?
  • 我尝试添加 tdf = tdf.reset_index(drop=True) 但是当我执行 rddf 我得到两个输出

标签: python pandas dask


【解决方案1】:

使用 df.copy() 能够得到预期的结果,但仍然不知道是什么导致了问题

import pandas as pd
import dask.dataframe as dd
import dask
tdf = pd.DataFrame({'a': [1, 2, 3, 4, 5, 6, 7, 8, 9],
               'b': [4, 5, 6, 3, 2, 1, 0, 0, 0]},
              index=[0, 1, 3, 5, 6, 8, 9, 9, 9])
ddf = dd.from_pandas(tdf, npartitions=3)
def func(df):
   df = df.copy()
   df['b'] = df.b - df.b.mean()
   return df
meta = tdf.groupby('a').apply(func)
rddf = ddf.groupby('a').apply(func,meta=meta).compute()

元是

        a   b
a           
1   0   1   0.0
2   1   2   0.0
3   3   3   0.0
4   5   4   0.0
5   6   5   0.0
6   8   6   0.0
7   9   7   0.0
8   9   8   0.0
9   9   9   0.0

rddf 是

       a    b
a           
5   6   5   0.0
9   9   9   0.0
1   0   1   0.0
2   1   2   0.0
6   8   6   0.0
7   9   7   0.0
8   9   8   0.0
3   3   3   0.0
4   5   4   0.0

【讨论】:

    【解决方案2】:

    我认为您需要 reset_index 和参数 drop=True 以获得唯一索引:

    tdf = tdf.reset_index(drop=True)
    

    然后获取所有0 值,因为groupby by a 长度为1 - 所以b 值与means 相同。

    如果更改a的值:

    import pandas as pd
    import dask.dataframe as dd
    tdf = pd.DataFrame({'a': [1, 1, 3, 4, 5, 6, 7, 8, 9], # double 1
                   'b': [4, 5, 6, 3, 2, 1, 0, 0, 0]},
                  index=[0, 1, 3, 5, 6, 8, 9, 9, 9])
    
    tdf = tdf.reset_index(drop=True)
    
    ddf = dd.from_pandas(tdf, npartitions=3)
    

    def func(df):
        df['b'] = df.b - df.b.mean()
        return df
    
    meta = tdf.groupby('a').apply(func)
    rddf = ddf.groupby('a').apply(func).compute()
    print (meta)
       a    b
    0  1 -0.5
    1  1  0.5
    2  3  0.0
    3  4  0.0
    4  5  0.0
    5  6  0.0
    6  7  0.0
    7  8  0.0
    8  9  0.0
    
    print (rddf)
       a    b
    4  5  0.0
    8  9  0.0
    5  6  0.0
    6  7  0.0
    7  8  0.0
    0  1 -0.5
    1  1  0.5
    3  4  0.0
    2  3  0.0
    

    对于相同的输出排序索引:

    print (rddf.sort_index())
       a    b
    0  1 -0.5
    1  1  0.5
    2  3  0.0
    3  4  0.0
    4  5  0.0
    5  6  0.0
    6  7  0.0
    7  8  0.0
    8  9  0.0
    

    【讨论】:

    • 我尝试了同样的方法,但它在ddf.groupby('a').apply(func).compute()get_async(pool.apply_async, len(pool._pool), dsk, result, 处中断,有时我得到上述结果,但在再次运行 group by 它抛出值错误后,我将尝试在笔记本外执行可能是它是异步的
    • 嗯,你用的是最新版的 pandas 和 dask 吗?对我来说,你的样品很好用。
    • 熊猫 - '0.20.2' 和 dask - '0.14.3'
    • 我在上面的测试示例代码中遇到了错误,如果它的行为符合预期,我打算将它用于真实数据
    • 嗯,我在 python 3.5.1 和 windows 下使用 0.20.30.15.2 dask。对我来说它有效。
    猜你喜欢
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 2020-06-05
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多