Pandas 如何用 read_fwf 读取补零的数字?
Pandas how to read 0-padded number with read_fwf?
我正在使用 read_fwf 来做显而易见的事情,但是 pandas 将从我们使用的数字字符串代码中删除左侧填充的零,并将类型视为 int。我们必须使用 "xxxx.yyy" 格式的各种代码也是如此,它将转换为浮点数并切掉前导零。
对于代码长度相同但其中许多长度不同(即:001234
和 0001234
)的列来说,这不是问题,因此我们无法可靠地zfill 数据——一旦 pandas 解析掉零,它们就会丢失。
我知道 read_fwf 的 dtype 将在下一次重大更新中推出,但我真的希望现在有一种方法可以防止 pandas 破坏我的数据。有人知道吗?
样本文件(test.fwf):
0001234 000.1234
001234 123.4567
00001234 345.6789
0005678 678.1234
0005678 000.1200
0005678 012.2301
0005678 234.5678
testfwf.py:
import pandas as pd
df = pd.read_fwf('test.fwf', colspecs=[(0, 8),(9, 19)])
df.columns = ['code_a', 'code_b']
In[2]: from testfwf import df
In[3]: df
Out[3]:
code_a code_b
0 1234 123.4567
1 1234 345.6789
2 5678 678.1234
3 5678 0.1200
4 5678 12.2301
5 5678 234.5678
首先,您丢失了一行数据。设置 header=None
以指定没有 header。其次,您可以使用转换器来指定列应该是一个字符串并防止剥离前导 0:
In [96]: pd.read_fwf('test.fwf', header=None, converters={0:str, 1:str})
Out[96]:
0 1
0 0001234 000.1234
1 001234 123.4567
2 00001234 345.6789
3 0005678 678.1234
4 0005678 000.1200
5 0005678 012.2301
6 0005678 234.5678
我正在使用 read_fwf 来做显而易见的事情,但是 pandas 将从我们使用的数字字符串代码中删除左侧填充的零,并将类型视为 int。我们必须使用 "xxxx.yyy" 格式的各种代码也是如此,它将转换为浮点数并切掉前导零。
对于代码长度相同但其中许多长度不同(即:001234
和 0001234
)的列来说,这不是问题,因此我们无法可靠地zfill 数据——一旦 pandas 解析掉零,它们就会丢失。
我知道 read_fwf 的 dtype 将在下一次重大更新中推出,但我真的希望现在有一种方法可以防止 pandas 破坏我的数据。有人知道吗?
样本文件(test.fwf):
0001234 000.1234
001234 123.4567
00001234 345.6789
0005678 678.1234
0005678 000.1200
0005678 012.2301
0005678 234.5678
testfwf.py:
import pandas as pd
df = pd.read_fwf('test.fwf', colspecs=[(0, 8),(9, 19)])
df.columns = ['code_a', 'code_b']
In[2]: from testfwf import df
In[3]: df
Out[3]:
code_a code_b
0 1234 123.4567
1 1234 345.6789
2 5678 678.1234
3 5678 0.1200
4 5678 12.2301
5 5678 234.5678
首先,您丢失了一行数据。设置 header=None
以指定没有 header。其次,您可以使用转换器来指定列应该是一个字符串并防止剥离前导 0:
In [96]: pd.read_fwf('test.fwf', header=None, converters={0:str, 1:str})
Out[96]:
0 1
0 0001234 000.1234
1 001234 123.4567
2 00001234 345.6789
3 0005678 678.1234
4 0005678 000.1200
5 0005678 012.2301
6 0005678 234.5678