Pandas read_fwf忽略了值

时间:2016-11-17 19:32:42

标签: 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.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列的化学名称,并用索引号(来自另一个文件)替换它们,并将任何缺失的数据替换为索引号为零。这很好用。

什么不起作用的是第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()读入标题和中间的空格,并且必须假设标记为beta的列与标记为alpha的列的末尾间隔2个字符,完全忽略了某些标记为alpha的负号。测试中的值。

我更改了所有列的标题位置,这可能是一个问题,并且问题已修复。

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()包含负号。

1 个答案:

答案 0 :(得分:2)

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

假设您有以下文件:

SELECT ID, COUNT(ID)
FROM sometable
GROUP BY ID
HAVING COUNT(ID) < 10

解决方案:(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

OLD回答:

试试这个:

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