我正在运行Python 3.5.2和Pandas 0.19.1。我使用read_fwf()
来读取最初在FORTRAN中格式化的大型数据文件。它看起来像这样的列:熊猫read_fwf忽略值
SiC4+ e- C2 c-SiC2 1.500e-07 -5.000e-01 0.000e+00 2.00e+00 0.00e+00 logn 8 10 280 3 746 1 1
SiC4+ e- C l-SiC3 1.500e-07 -5.000e-01 0.000e+00 2.00e+00 0.00e+00 logn 8 10 280 3 747 1 1
O e- O- 1.500e-15 0.000e+00 0.000e+00 2.00e+00 0.00e+00 logn 8 10 280 3 744 1 1
S e- S- 5.000e-15 0.000e+00 0.000e+00 2.00e+00 0.00e+00 logn 8 10 280 3 745 1 1
要读这,我使用此代码:
convert = lambda x: int(species[x]) if x!='' else None
reactions = pd.read_fwf('data.dat',sep='\s+',converters{0:convert,1:convert,2:convert,3:convert})
reactions.fillna(0,inplace=True)
该转换器把前4列化学名称和其索引编号替换它们(来自另一个文件),并且任何丢失的数据都被索引号0替换。这工作正常。
什么不行的是第6列和第15列。
116 76 7 30 1.500000e-07 0.5 0.0 2.0 0.0 logn 8 10 280 3 46 1 1
116 76 1 41 1.500000e-07 0.5 0.0 2.0 0.0 logn 8 10 280 3 47 1 1
4 76 74 0 1.500000e-15 0.0 0.0 2.0 0.0 logn 8 10 280 3 44 1 1
5 76 75 0 5.000000e-15 0.0 0.0 2.0 0.0 logn 8 10 280 3 45 1 1
这是怎么回事?第6列失去负号,第15列失去领先的'7'。我找不到为什么发生这种情况的原因,而且没有任何意义。文件中带有负号的其他列保持不变。
更新
下面的解决方案是不是不正确,但它为我工作需要对文件头一个非常重要的变化。我的文件的第7列看起来像这样(有头):
Input1 Input2 Output1 Output2 alpha beta gamma
NC3 CRP C2 CN 2.000e+03 0.000e+00 0.000e+00
C2N2 CRP CN CN 2.000e+03 0.000e+00 0.000e+00
NC7 CRP C6 CN 2.000e+03 -1.000e+00 0.000e+00
read_fwf()
读页眉和中之间的空间,并且必须假定列标测试版本是间隔从2点月底的字符掉标记为alpha的列,完全忽略了beta中某些值的负号。
我改变了所有列的标题位置,这可能是一个问题,并且问题已修复。
Input1 Input2 Output1 Output2 alpha beta gamma
NC3 CRP C2 CN 2.000e+03 0.000e+00 0.000e+00
C2N2 CRP CN CN 2.000e+03 0.000e+00 0.000e+00
NC7 CRP C6 CN 2.000e+03 -1.000e+00 0.000e+00
请注意,beta(和gamma)的文件头被拉到一个空间左侧。这足够早地启动该列以便read_fwf()
包括负号。
MaxU的答案是好的,但只是一个快速评论:用'九月='你给一个分离器,但read_fwf'的'的一点是,你有一列有序的文件,而不是分隔符组织的文件。所以我认为你不想把'read_fwf'和'sep ='参数结合起来。如果你想使用分隔符,只需使用'read_csv' – JohnE
从来没有想到'sep ='会是问题所在。我认为它是良性的,因为它被包含在'read_fwf()'的文档中。 – SteelAngel