Pandas read_fwf:指定数据类型

6

我正在分块读取一个巨大的固定宽度文本文件,并将数据导出为csv。因为pandas.read_fwf不允许指定数据类型,所以我想知道是否存在其他方法来强制将列转换为字符串。原因是pandas会将一些列推断为浮点数,即使它们不是,我也不希望在列中出现.0

使用data[column] = data[column].astype(str)没有用,因为它不能去掉小数点。将float64数据类型的列转换为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',''),但是我想找到比迭代列更简单的方法,因为这需要很长时间。


它支持dtype,请查看文档http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_fwf.html - Abbas
1个回答

9

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

感谢您展示一个示例!它完美地运作。我完全忽略了转换器选项... - calpyte

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接