Я имею дело с большими (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'))