达斯达克(Dask):具有最大的Groupby会自动引入索引,并且不允许reset_index()

时间:2019-02-03 01:39:11

标签: grouping dask dask-distributed

我一直试图通过以下方法从该question获取组中最大的行。这个问题的解决方案在一定程度上都是正确的。

在此示例中,我对列A进行分组,并希望基于C中的前两个值返回DB的行。

由于某种原因,grp_df的索引是多级的,并且同时包含A和原始索引ddf

我希望简单地reset_index()放下不需要的索引并只保留A,但是出现以下错误:

ValueError: The columns in the computed data do not match the columns in the provided metadata

这是一个重现该错误的简单示例:

import numpy as np
import dask.dataframe as dd
import pandas as pd

np.random.seed(42)

df = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD'))

ddf = dd.from_pandas(df, npartitions=3)

grp_df = ddf.groupby('A')[['B','C']].apply(lambda x: x.nlargest(2, columns=['B']), meta={
    "B": 'f8', "C": 'f8'})

# Print is successful and results are correct
print(grp_df.head())

grp_df = grp_df.reset_index()

# Print is unsuccessful and shows error below
print(grp_df.head())

1 个答案:

答案 0 :(得分:1)

有溶液实测值的方法here

以下代码现在允许reset_index()工作并摆脱了原始的ddf索引。仍然不确定为什么最初的ddf索引首先是通过groupby的

meta = pd.DataFrame(columns=['B', 'C'], dtype=int, index=pd.MultiIndex([[], []], [[], []], names=['A', None]))
grp_df = ddf.groupby('A')[['B','C']].apply(lambda x: x.nlargest(2, columns=['B']), meta=meta)

grp_df = grp_df.reset_index().drop('level_1', axis=1)