2016-04-19 4 views
2

Я читаю в огромном текстовом файле фиксированной ширины в кусках и экспортирую данные как csv. Потому что pandas.read_fwf не позволяет указать типы dtypes, я задаю вопрос, что еще существует, чтобы заставить столбцы быть строками. Причина заключается в том, что pandas отображает некоторые столбцы как float, хотя они не являются и Я не хочу .0 внутри столбца.Pandas read_fwf: указать dtype

Использование data[column] = data[column].astype(str) не помогает, так как оно не получится избавиться от десятичных знаков. Преобразование столбцов float64 dtype в int не работает либо, так как NA не могут быть преобразованы. Есть идеи?

Вот отрывок из моего кода:

dat = pd.read_fwf(file_to_read,colspecs=cols,header=None,chunksize=100000,names=header) 
#First chunk 
data.info() 
Int64Index: 100000 entries, 0 to 99999 
Columns: 562 entries, 
dtypes: float64(405), int64(4), object(153) 
memory usage: 429.5+ MB 

for column in data.columns: 
    if data[column].dtype == 'float64': 
     data[column] = data[column].astype(int) 
    else: 
     pass 

я мог сделать str().replace('.0',''), но я хочу, чтобы найти более легкий путь, чем итерации через колонку, которая занимает много времени.

+0

Это делает поддержку DTYPE пожалуйста проверьте документацию http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_fwf.html – Abbas

ответ

1

Параметр converter может использоваться, чтобы сохранить данные в виде строк с момента pd.read_fwf не пытается угадать DTYPE, если преобразователь указано:

import pandas as pd 
try: 
    # for Python2 
    from cStringIO import StringIO 
except ImportError: 
    # for Python3 
    from io import StringIO 

content = '''\ 
1.0 2 A 
3.0 4 B 
5  X C 
M  Y D 
''' 
header = ['foo', 'bar', 'baz'] 

for df in pd.read_fwf(StringIO(content), header=None, chunksize=2, names=header, 
         converters={h:str for h in header}): 
    print(df) 
df.info() 

дает

foo bar baz 
0 1.0 2 A 
1 3.0 4 B 

    foo bar baz 
0 5 X C 
1 M Y D 

<class 'pandas.core.frame.DataFrame'> 
RangeIndex: 2 entries, 0 to 1 
Data columns (total 3 columns): 
foo 2 non-null object 
bar 2 non-null object 
baz 2 non-null object 
dtypes: object(3) 
memory usage: 120.0+ bytes 
+0

Спасибо за демонстрацию примера! Он работает отлично. Я полностью игнорировал вариант конвертера ... – chizze

Смежные вопросы