Редактировать Возможно, ваша проблема исходит от 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