使用关闭列有问题的pandas读入csv文件

时间:2015-10-12 04:34:11

标签: python csv pandas

我有这个人。 csv文件:

RUN   YR    AP15    PMTE
   12008    4.53    0.04
   12009    3.17    0.26
   12010    6.20    1.38
   12011    5.38    3.55
   12012    7.32    6.13
   12013    4.39    9.40

这里,列' YR'拥有2008年,2009年...... 2013年的价值观。但是,YR的值与RUN的值之间没有空格。因此,当我尝试读入数据帧时,它无法正确读取YR列。

pandas.read_csv('file.csv', skipinitialspace=True, usecols=['YR','PMTE'], sep=' ')

上面的行读取AP15列而不是YR。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

看起来像你的csv'实际上是一个固定宽度的格式文件。有时候这些文件会附带另一个列出每列大小的文件,但也许你不幸运,并且必须手动计算列宽。您可以使用pandas的固定宽度读取功能阅读此文件:

df = pd.read_fwf('fixed_width.txt', widths=[4, 4, 8, 8])

In [7]: df
Out[7]: 
   RUN    YR  AP15  PMTE
0    1  2008  4.53  0.04
1    1  2009  3.17  0.26
2    1  2010  6.20  1.38
3    1  2011  5.38  3.55
4    1  2012  7.32  6.13
5    1  2013  4.39  9.40

In [8]: df.columns
Out[8]: Index(['RUN', 'YR', 'AP15', 'PMTE'], dtype='object')

可以选择自动查找宽度,但每列之间可能至少需要一个空格,因为它似乎不适用于此。

答案 1 :(得分:1)

您可以为此做的一个解决方法是首先将列RUNYR作为csv的列。示例 -

   RUNYR    AP15    PMTE
   12008    4.53    0.04
   12009    3.17    0.26
   12010    6.20    1.38
   12011    5.38    3.55
   12012    7.32    6.13
   12013    4.39    9.40

然后将csv读入数据框,并将RUNYR作为字符串列,然后将RUNYR列切片以使用pandas.Series.str.slice方法生成两个不同的列。示例 -

df = pd.read_csv('file.csv', skipinitialspace=True, header=0, sep=' ',dtype={'RUNYR':str})

df['RUN'] = df['RUNYR'].str.slice(None,1).astype(int)
df['YR'] = df['RUNYR'].str.slice(1).astype(int)

df = df.drop('RUNYR',axis=1)

演示 -

In [21]: df = pd.read_csv('a.csv', skipinitialspace=True, header=0, sep=' ',dtype={'RUNYR':str})

In [22]: df['RUN'] = df['RUNYR'].str.slice(None,1).astype(int)

In [23]: df['YR'] = df['RUNYR'].str.slice(1).astype(int)

In [24]: df = df.drop('RUNYR',axis=1)

In [25]: df
Out[25]:
   AP15  PMTE  RUN    YR
0  4.53  0.04    1  2008
1  3.17  0.26    1  2009
2  6.20  1.38    1  2010
3  5.38  3.55    1  2011
4  7.32  6.13    1  2012
5  4.39  9.40    1  2013

然后使用.to_csv方法将此内容写回您的csv(以永久修复您的csv)。