Pandas无法识别csv列

ws51t4hk  于 2023-04-18  发布在  其他
关注(0)|答案(3)|浏览(177)

我使用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'

我使用的代码是:

filename = "PovertyEstimates.csv"
#filename = "nm.csv"

f = open(filename)
import pandas as pd

data = pd.read_csv(f)#, index_col=0)
print data['State']

甚至当我使用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)

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
nr7wwzry

nr7wwzry1#

空格可能是问题所在。你需要告诉pandas在解析CSV时使用什么分隔符。

data = pd.read_csv(f, sep=" ")

但问题是,它会选择 all 空格作为有效的分隔符(例如亚拉巴马County变成2列)。最好是将一个文件转换为一个实际的逗号(分号或其他)分隔文件,或者确保复合值被引用(“Alabama County”),然后指定引号:

data = pd.read_csv(f, sep=" ", quotechar='"')
mnowg1ta

mnowg1ta2#

根据Pandas的记录。
https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html
read_csv方法将以CSV文件中的逗号为目标。如果您的文件不包含逗号,则它将读取为一大块文本。传入参数sep将告诉pandas在何处分隔。

h7appiyu

h7appiyu3#

问题是您的文件不是csvpd.read_csv需要csv输入。您的文件格式不同,可能是制表符分隔的。
我们可以使用datatable的方便的fread而不是pandas,然后转换。fread将自动检测文件类型:

$ pip3 install datatable
$ python3
>>> import datatable as dt
>>> import pandas as pd
>>> DT = dt.fread("PovertyEstimates.csv")
>>> data_pd = DT.to_pandas()
>>> DT.head()

   | index  FIPStxt  State    Area_name  Rural-urban_Continuum  Code_2003
   | int32  str32    str32    str32                      int32      int32
-- + -----  -------  -------  ---------  ---------------------  ---------
 0 |  1000  AL       Alabama  NA                            NA         NA
 1 |  1001  AL       Autauga  County                         2          2
 2 |  1003  AL       Baldwin  County                         4          5

>>> data_pd.head()

   index FIPStxt    State Area_name  Rural-urban_Continuum  Code_2003
0   1000      AL  Alabama      None                    NaN        NaN
1   1001      AL  Autauga    County                    2.0        2.0
2   1003      AL  Baldwin    County                    4.0        5.0

如果需要第一列包含前导零,请指定列类型,并将该列作为字符串。

>>> DT = dt.fread("PovertyEstimates.csv", columns=[dt.str32, dt.str32, dt.str32, dt.str32, dt.int32, dt.int32])

>>> DT.head()
   | index  FIPStxt  State    Area_name  Rural-urban_Continuum  Code_2003
   | str32  str32    str32    str32                      int32      int32
-- + -----  -------  -------  ---------  ---------------------  ---------
 0 | 01000  AL       Alabama  NA                            NA         NA
 1 | 01001  AL       Autauga  County                         2          2
 2 | 01003  AL       Baldwin  County                         4          5
[3 rows x 6 columns]
>>> DT.ltypes
(ltype.str, ltype.str, ltype.str, ltype.str, ltype.int, ltype.int

相关问题