Как поместить одну строку в dask.dataframe? - PullRequest
0 голосов
/ 02 февраля 2019

Я пытаюсь выбрать только одну строку из dask.dataframe с помощью команды x.loc[0].compute().Возвращает 4 строки, все из которых имеют index=0.Я пробовал reset_index, но после сброса все еще будет 4 строки, имеющие index=0.(Я думаю, что я сделал сброс правильно, потому что я сделал reset_index(drop=False), и я мог видеть исходный индекс в новом столбце.)чем одна строка с index=0 из-за того, как можно структурировать данные чанка.

Итак, если я действительно хочу только одну строку, используя index=0 для поднабора, как я могу это сделать?

1 Ответ

0 голосов
/ 02 февраля 2019

Редактировать Возможно, ваша проблема исходит от reset_index.Эта проблема объясняется в конце ответа.Более ранняя часть текста содержит информацию о том, как ее решить.

Например, существует следующий DataFrame dask:

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


df = pd.DataFrame({'col_1': [1,2,3,4,5,6,7], 'col_2': list('abcdefg')}, 
                  index=pd.Index([0,0,1,2,3,4,5]))
df = dd.from_pandas(df, npartitions=2)
df.compute()
Out[1]: 
   col_1 col_2
0      1     a
0      2     b
1      3     c
2      4     d
3      5     e
4      6     f
5      7     g

имеет числовой индекс с повторяющимися значениями 0.Поскольку loc является

Индексатором, основанным исключительно на расположении метки, для выбора по метке

- он выбирает оба значения 0 с метками, если вы это сделаете

df.loc[0].compute()
Out[]: 
   col_1 col_2
0      1     a
0      2     b

- вы получите все строки с 0 -s (или другой указанной меткой).

В pandas есть pd.DataFrame.iloc, который помогает намвыбрать строку по ее числовому индексу.К сожалению, в dask вы не можете сделать это, потому что iloc - это

Чисто-целочисленное индексирование для выбора по позиции.

Поддерживается только индексация позиций столбцов,Попытка выбрать позиции строки вызовет ошибку ValueError.

Чтобы справиться с этой проблемой, вы можете выполнить несколько хитростей индексирования:

df.compute()
Out[2]: 
   index  col_1 col_2
x                    
0      0      1     a
1      0      2     b
2      1      3     c
3      2      4     d
4      3      5     e
5      4      6     f
6      5      7     g

- теперь есть новый индекс в диапазоне от 0 до длины фрейма данных - 1.

Можно нарезать его с помощью loc и сделать следующее (я полагаю, что выбор метки 0 с помощью loc означает «сначала выбрать»)строка "):

df.loc[0].compute()
Out[3]: 
   index  col_1 col_2
x                    
0      0      1     a

Об умноженной метке индекса 0
Если вам нужен оригинальный индекс, он все еще здесь, и к нему можно получить доступ через

df.loc[:, 'index'].compute()
Out[4]: 
x
0    0
1    0
2    1
3    2
4    3
5    4
6    5

Полагаю, вы получаете такое дублирование от reset_index() или около того, потому что он генерирует новый 0-начальный индекс для каждого раздела, например, для этой таблицы из 2 разделов:

df.reset_index().compute()
Out[5]: 
   index  col_1 col_2
0      0      1     a
1      0      2     b
2      1      3     c
3      2      4     d
0      3      5     e
1      4      6     f
2      5      7     g
...