我正在使用 pandas 读取 .csv 数据文件。对于我的一个文件,我可以使用列标题进行索引。对于其他我收到错误消息
File "/usr/lib/python2.7/dist-packages/pandas/core/internals.py",
line 1023, in _check_have
raise KeyError('no item named %s' % com.pprint_thing(item))
KeyError: u'no item named State'
Run Code Online (Sandbox Code Playgroud)
我使用的代码是:
filename = "PovertyEstimates.csv"
#filename = "nm.csv"
f = open(filename)
import pandas as pd
data = pd.read_csv(f)#, index_col=0)
print data['State']
Run Code Online (Sandbox Code Playgroud)
即使当我使用index_col时我也会得到同样的错误(除非它是0)。我发现当我打印在我的终端中不起作用的 csv 文件时,它不会像现在那样分成几列。相反,每行中的项目是连续打印的,并用空格分隔。我相信这种不正确的分离就是问题所在。
我在 Ubuntu Linux 上使用 LibreOffice Calc。对于格式不正确的文件(在 LibreOffice 中以完美格式显示),终端输出为:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 3194 entries, 0 to 3193
Data columns:
FIPStxt State Area_name Rural-urban_Continuum Code_2003 Urban_Influence_Code_2003 Rural-urban_Continuum Code_20013 Urban_Influence_Code_20013 POVALL_2011 CI90LBAll_2011 CI90UBALL_2011 PCTPOVALL_2011 CI90LBALLP_2011 CI90UBALLP_2011 POV017_2011 CI90LB017_2011 CI90UB017_2011 PCTPOV017_2011 CI90LB017P_2011 CI90UB017P_2011 POV517_2011 CI90LB517_2011 CI90UB517_2011 PCTPOV517_2011 CI90LB517P_2011 CI90UB517P_2011 MEDHHINC_2011 CI90LBINC_2011 CI90UBINC_2011 POV05_2011 CI90LB05_2011 CI90UB05_2011 PCTPOV05_2011 CI90LB05P_2011 CI90UB05P_2011 3194 non-null values
dtypes: object(1)
Run Code Online (Sandbox Code Playgroud)
csv 文件的前几行是:
FIPStxt State Area_name Rural-urban_Continuum Code_2003
01000 AL Alabama
01001 AL Autauga County 2 2
01003 AL Baldwin County 4 5
Run Code Online (Sandbox Code Playgroud)
空间可能是问题所在。您需要告诉 pandas 在解析 CSV 时使用什么分隔符。
data = pd.read_csv(f, sep=" ")
Run Code Online (Sandbox Code Playgroud)
但问题是,它会选取所有空格作为有效分隔符(例如,阿拉巴马县变为 2 列)。最好的方法是将该文件转换为实际的逗号(分号或其他)分隔文件,或确保引用复合值(“阿拉巴马县”),然后指定 quotechar:
data = pd.read_csv(f, sep=" ", quotechar='"')
Run Code Online (Sandbox Code Playgroud)