Dask dataframe index_col - PullRequest
       6

Dask dataframe index_col

0 голосов
/ 18 апреля 2020

Я имею дело с большими (20-100 ГБ) текстовыми файлами с разделителями табуляции, которые я могу правильно импортировать в pandas с опцией index_col=False. Кадр данных Dask не поддерживает параметр index_col. Я могу обойти, но любопытно, если есть более разумный способ справиться с этим. Без опции index_col=False, pandas и dask считывают столбцы, сдвинутые один раз вправо - т. Е. Col1 выровнен по данным col2, et c. Я полагаю, это потому, что строки данных имеют конечную вкладку, а заголовок - нет.

Вот пример файла - ^I - это вкладка, а $ - конец строки.

Col1^ICol2^ICol3^ICol4^ICol5^ICol6^ICol7^ICol8$
0^I0^ICODE^I-0.2628^I3.041e-001^I.^I0^I2.1213^I$

Обновление: показывает поведение, которое я хочу и не хочу.

TESTDATA = """Index1\tIndex2\tCodeId\tCol4\tCol5\tCol6\tCol7\tCol8
0\t0\tCODE\t-0.2628\t3.041e-001\t.\t0\t2.1213\t
"""
TESTFILE = "test.txt"
with open(TESTFILE, "w") as text_file:
    text_file.write(TESTDATA)
import pandas as pd

df = pd.read_csv(TESTFILE,sep='\t')
print("INCORRECT - Col8 is NaN")
print(df.head())
df = pd.read_csv(TESTFILE,sep='\t', index_col=False)
print("CORRECT - index and code correct and Col4-8 correct")
print(df.head())

Результаты:

INCORRECT - Col8 is NaN
   Index1 Index2  CodeId    Col4 Col5  Col6    Col7  Col8
0       0   CODE -0.2628  0.3041    .     0  2.1213   NaN
CORRECT - index and code correct and Col4-8 correct
   Index1  Index2 CodeId    Col4    Col5 Col6  Col7    Col8
0       0       0   CODE -0.2628  0.3041    .     0  2.1213

Удаление первого столбца просто удаляет столбец, который мне действительно нужен .

import dask.dataframe as dd

ddf = dd.read_csv(TESTFILE,sep='\t')
print(ddf.compute())

ddf = dd.read_csv(TESTFILE,sep='\t')
res = ddf.drop(columns=['Index1'])
print(res.compute())

Результаты для обоих не то, что я ищу.

Кроме того, спасибо за ваш ответ, мой обходной путь похож на тот, который вы предлагаете. Просто, когда я делюсь dask с коллегами, я надеюсь, что минимальные различия в поведении между pandas и dask dfs - просто проверка, если я что-то пропустил.

Наконец, вот мой собственный обходной путь:

# manage trailing delimiter issue with pandas 
# which is more complicated with dask since 
# index_col cannot be used
def ddf_cols_mod(file, sep):
    df = dd.read_csv(file, sep=sep, nrows=0)
    cols = list(df.columns)
    cols.append('None')
    return cols

ddf = dd.read_csv(file,
                  sep='\t',
                  header=0,
                  names=ddf_cols_mod(file, '\t'))

1 Ответ

0 голосов
/ 18 апреля 2020

Когда вы передаете index_col = False в Pandas, он «пропускает» крайний левый столбец.

Как dask версия read_csv не поддерживает этот параметр, вы можете получить тот же результат следующим образом:

  • Считать файл целом (все столбцы).
  • Оставьте первый столбец ( 'Col1' ) самостоятельно.

Таким образом, код может быть:

ddf = dd.read_csv('Input.csv', sep='\t')
res = ddf.drop(columns=['Col1'])

Или, если имя первого столбца может варьироваться, вы можете запустить:

cc = ddf.columns[0]
res = ddf.drop(columns=[cc])

В обоих случаях результирующий DataFrame не содержит первый столбец.

Другая возможность

Вызов dd.read_csv передача usecols со списком всех столбцов, кроме первого.

...