我使用
读取了一个csv文件x = pd.read_table('path to csv')
我可以在打印x上看到以行为单位的逗号分隔的数据值列表,这很好。但是当我尝试使用x.col1访问任何列时,它会出错:
**AttributeError: 'DataFrame' object has no attribute 'col1'**
我也尝试过:
y = DataFrame(x)
并通过y检索列但没有运气。但是,命令x.columns有效。只是不知道这里有什么问题。
请帮助!!
答案 0 :(得分:1)
我认为read_table
有默认的分隔符标签,因此必须定义分隔符参数:
x = pd.read_table('path to csv', sep=',')
或者使用read_csv
与默认分隔符,
,因此sep
:可以省略。
x = pd.read_csv('path to csv')
答案 1 :(得分:0)
尝试使用以下方法去除列名称周围的潜在空格:
x.columns = [col.strip() for col in x.columns.tolist()]
或者正如文件here中所建议的那样,并在@ jezrael的回答中强调:
x.columns = x.columns.str.strip()
然后,您将能够使用x.col1..x.coln
访问列。另请注意,列名称区分大小写。
>>> import pandas as pd
>>> df = pd.DataFrame([[1,2],[3,4]], columns=[' col1', 'col2 '])
>>> df
col1 col2
0 1 2
1 3 4
>>> df.col1
Traceback (most recent call last):
.. return object.__getattribute__(self, name)
AttributeError: 'DataFrame' object has no attribute 'col1'
>>> df.col2
Traceback (most recent call last):
... return object.__getattribute__(self, name)
AttributeError: 'DataFrame' object has no attribute 'col2'
>>> df.columns = [col.strip() for col in df.columns.tolist()]
>>> df.col1
0 1
1 3
Name: col1, dtype: int64
>>> df.col2
0 2
1 4
Name: col2, dtype: int64
>>>
答案 2 :(得分:0)
我遇到了同样的问题,并检查了所有答案(包括第一个答案),但对我来说都无济于事,直到我运行
print(dataset.columns.tolist())
然后我找到了魔鬼:
['\xef\xbb\xbfLabel', 'blabla','blabla']
请注意,该行的第一个元素应该是'Label'(顺便说一句,熊猫似乎不欢迎使用'Label'作为标签名称,所以我后来改了其他名称。)
我做了一些挖掘,发现了
中\ x实际上表示该值是十六进制,是字节顺序标记,表示文本是Unicode。
为什么对我们很重要? 您不能假定您读取的文件是干净的。它们可能包含这样的多余符号,可能会使您的脚本丢掉。
我尝试了很多方法来摆脱它,最方便的方法是...在第一列之前添加一个空的','(我使用的是csv,即在该列之前添加一个空列数据集中的第一列(仅适用于垃圾邮件)。因此,这些列证明是:
['\xef\xbb\xbf', 'Label', 'blabla', 'blabla']
问题解决了!