我正在从csv文件导入数据以用于pandas数据框。我的数据文件有102行和5列,并且所有这些文件在Excel中都清楚地标记为“数字”。我的代码如下:
import pandas as pd
data = pd.read_csv('uni.csv', header=None, names = ['TopThird', 'Oxbridge', 'Russell', 'Other', 'Low'])
print data.head()
输出如下所示:
TopThird Oxbridge Russell Other Low
0 14\t1\t12\t35\t1 NaN NaN NaN NaN
1 14\t1\t12\t32\t0 NaN NaN NaN NaN
2 16\t0\t13\t33\t0 NaN NaN NaN NaN
3 10\t0\t9\t44\t1 NaN NaN NaN NaN
4 18\t1\t13\t28\t1 NaN NaN NaN NaN
这继续到数据框的底部。我试图将Excel中的单元格类型更改为“常规”或使用“数字”类型上的小数点,但这并没有改变任何内容。
为什么会这样?如何预防?
看起来您的文件是制表符分隔值的文件。你需要明确地让read_csv
知道它正在处理空格字符作为分隔符。
在大多数情况下,通过sep='\t'
应该工作。
df = pd.read_csv('uni.csv',
sep='\t',
header=None,
names=['TopThird', 'Oxbridge', 'Russell', 'Other', 'Low'])
但是,在某些情况下,列不是完全分隔的。假设您有TSV数字,那么使用delim_whitespace=True
应该没问题 -
df = pd.read_csv('uni.csv',
delim_whitespace=True,
header=None,
names=['TopThird', 'Oxbridge', 'Russell', 'Other', 'Low'])
这相当于sep='\s+'
,并且更加概括,谨慎使用。从好的方面来说,如果你的列有杂散的空格,这应该自动处理。
正如@Vaishali所提到的,有一个替代函数pd.read_table
对宽度TSV文件很有用,并且可以使用你传递给read_csv
的相同参数 -
df = pd.read_table('uni.csv', header=None, names=[...])
看起来像制表符分隔的数据。试试sep='\t'
data = pd.read_csv('uni.csv', sep='\t', header=None, names = ['TopThird', 'Oxbridge', 'Russell', 'Other', 'Low'])