Python 3.x 熊猫读取_fwf忽略值

Python 3.x 熊猫读取_fwf忽略值,python-3.x,pandas,Python 3.x,Pandas,我正在运行Python 3.5.2和Pandas 0.19.1。我使用read_fwf()读取最初用FORTRAN格式化的大型数据文件。它有如下列: 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.000

我正在运行Python 3.5.2和Pandas 0.19.1。我使用
read_fwf()
读取最初用FORTRAN格式化的大型数据文件。它有如下列:

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)
转换器取前四列的化学名称,并用索引号(来自另一个文件)替换它们,任何缺少的数据都用索引号零替换。这个很好用

不起作用的是第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列如下所示(带有标题):

read_fwf()
读取标题和中间的空格,并且必须假定标记为beta的列与标记为alpha的列的末尾相隔2个字符,完全忽略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()
包含负号

更新:更新问题的解决方案:

假设您有以下文件:

Input1    Input2   Output1    Output2    alpha      beta       gamma     
NC3       CRP      C2         CN         2.000e+03  0.000e+00  0.000e+00
C2N2      CRP                 CN         2.000e+03  0.000e+00  0.000e+00 
NC7                C6         CN         2.000e+03 -1.000e+00  0.000e+00
解决方案:(
fn
-是文件的完整路径)

旧答案:

试试这个:

In [63]: fn = r'D:\temp\.data\1.fwf'

In [64]: df = pd.read_fwf(fn, header=None)

In [65]: df
Out[65]:
      0   1   2       3             4    5    6    7    8     9   10  11   12  13   14  15  16
0  SiC4+  e-  C2  c-SiC2  1.500000e-07 -0.5  0.0  2.0  0.0  logn   8  10  280   3  746   1   1
1  SiC4+  e-   C  l-SiC3  1.500000e-07 -0.5  0.0  2.0  0.0  logn   8  10  280   3  747   1   1
2      O  e-  O-     NaN  1.500000e-15  0.0  0.0  2.0  0.0  logn   8  10  280   3  744   1   1
3      S  e-  S-     NaN  5.000000e-15  0.0  0.0  2.0  0.0  logn   8  10  280   3  745   1   1

MaxU的回答很好,但只是一个简短的评论:使用
sep=
您给出了一个分隔符,但是
read\u fwf
的要点是您有一个列组织的文件,而不是一个分隔符组织的文件。所以我认为你永远不会想把
read\u fwf
sep=
参数结合起来。如果您想使用分隔符,只需使用
read\u csv
我从未想到
sep=
会是问题所在。我认为它是良性的,因为它包含在
read_fwf()
@SteelAngel的文档中,请参阅更新
In [164]: df = pd.read_fwf(fn, header=None, skiprows=1)

In [165]: df.columns = pd.read_csv(fn, delim_whitespace=True, nrows=1).columns

In [166]: df
Out[166]:
  Input1 Input2 Output1 Output2   alpha  beta  gamma
0    NC3    CRP      C2      CN  2000.0   0.0    0.0
1   C2N2    CRP     NaN      CN  2000.0   0.0    0.0
2    NC7    NaN      C6      CN  2000.0  -1.0    0.0
In [63]: fn = r'D:\temp\.data\1.fwf'

In [64]: df = pd.read_fwf(fn, header=None)

In [65]: df
Out[65]:
      0   1   2       3             4    5    6    7    8     9   10  11   12  13   14  15  16
0  SiC4+  e-  C2  c-SiC2  1.500000e-07 -0.5  0.0  2.0  0.0  logn   8  10  280   3  746   1   1
1  SiC4+  e-   C  l-SiC3  1.500000e-07 -0.5  0.0  2.0  0.0  logn   8  10  280   3  747   1   1
2      O  e-  O-     NaN  1.500000e-15  0.0  0.0  2.0  0.0  logn   8  10  280   3  744   1   1
3      S  e-  S-     NaN  5.000000e-15  0.0  0.0  2.0  0.0  logn   8  10  280   3  745   1   1