Панды читают fwf: укажите dtype



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



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



Вот фрагмент моего кода:



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',''), но я хочу найти более простой способ, чем
итерация по столбцу, которая занимает много времени.

443   1  

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

Comments

    Ничего не найдено.