我有这个人。 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。我该如何解决这个问题?
答案 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)
您可以为此做的一个解决方法是首先将列RUN
和YR
作为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)。