Dask groupby应用得很好

时间:2017-09-19 08:36:38

标签: python pandas dask

我正在尝试在dask中运行groupby for this test example

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:无法从重复的轴重新索引' 并重复执行代码的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

为什么会发生相同的代码,不同的结果?

2 个答案:

答案 0 :(得分: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()

meta是

        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

答案 1 :(得分:0)

对于唯一索引,我认为您需要reset_index参数drop=True

tdf = tdf.reset_index(drop=True)

然后获取所有0值,因为groupby的{​​{1}}长度为1 - 所以a值与b s相同。

如果更改mean

的值
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