Dask: Groupby с nlargest автоматически вводит индекс и не разрешает reset_index () - PullRequest
0 голосов
/ 03 февраля 2019

Я пытался получить самые маленькие строки для группы, следуя методу из этого вопроса .Решение вопроса является правильным до некоторой точки.

В этом примере я группирую столбец A и хочу вернуть строки C и D на основе двух верхних значений в B.

По какой-то причине индекс 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 голосов
/ 03 февраля 2019

Найден подход для решения здесь .

Следующий код теперь позволяет reset_index() работать и избавляется от исходного индекса ddf.До сих пор не уверен, почему первоначальный индекс ddf прошел через группу в первую очередь, хотя

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)
...