Индексирование в серию Dask возвращает серию Dask - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть серия Dask с данными Dask.

Я бы хотел проиндексировать эту серию, чтобы получить кадры Dask для последующей работы.

Однако использование loc[0] приводит к другому Серия Dask. Использование to_frame также не работает, потому что в результате получается «кадр данных Dask из серии Dask с кадрами данных Dask».

Вот минимальный пример, в котором используется серия данных Dask с Pandas данными (не точно так же, но иллюстрирует проблему):

import pandas as pd
import dask.dataframe as dd

pdf1 = pd.DataFrame({'a': [1,2,3,4], 'b': [4,3,2,1]})
pdf2 = pd.DataFrame({'a': [4,3,2,1], 'b': [1,2,3,4]})

ps = pd.Series([pdf1, pdf2])
ds = dd.from_pandas(ps, npartitions=1)

print(type(ds.loc[0])) # still dask series
print(type(ds.loc[1])) # still dask series

print(ds.compute().loc[0]) # this is a pandas dataframe
print(ds.loc[0].compute()) # this is a pandas series
print(ds.loc[0].compute().loc[0]) # need to index into the singleton series to get back the dataframe

Похоже, что как только объект становится серией dask, все последующие комбинаторы сохраняют его как серию dask до compute, что возвращает "singleton" pandas series.

Можно ли в любом случае сказать dask, что я должен относиться к индексируемому объекту того типа, который, как я ожидаю, будет?

Ответы [ 2 ]

1 голос
/ 16 февраля 2020

Я подозреваю, что причина этого в том, что Dask не знает, что существует только одно значение индекса со значением 0. В принципе, может быть много строк со значением индекса 0, и поэтому общий тип вывода для .loc это серия.

Это идет вразрез с нашей интуицией, когда у нас есть уникальные значения индексов, которые могут вызвать разочарование, с которым вы, похоже, столкнулись.

1 голос
/ 04 февраля 2020

У вас могут быть причины для сохранения ваших фреймов данных в серии, которые я не понимаю из примера, но я предполагаю, что вам будет лучше, если вы сохраните свои оригинальные фреймы данных как разделы в dask. Затем вы можете присоединиться к ним, используя concat, как в примере ниже:

import pandas as pd
import dask.dataframe as dd

pdf1 = pd.DataFrame({'a': [1,2,3,4], 'b': [4,3,2,1]})
pdf2 = pd.DataFrame({'a': [4,3,2,1], 'b': [1,2,3,4]})

ddf1 = dd.from_pandas(pdf1, npartitions=1)
ddf2 = dd.from_pandas(pdf2, npartitions=1)

ddf = dd.concat([ddf1, ddf2], axis=0)
ddf.compute()

Вы можете получить доступ к первому разделу с помощью ddf.partitions[0].compute()

Что еще более важно, если вы исходные кадры данных индексируются, и индекс сортируется, и индексы не перекрываются, тогда concat правильно установит деление соединенных фреймов данных без необходимости переиндексации. Вы можете проверить деления с помощью ddf.divisions, что в этом примере покажет (None, None, None), но исправьте деления, если вы начнете с правильной индексацией.

...