我正在尝试在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
为什么会发生相同的代码,不同的结果?
答案 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