Pandas read_csv index_col= 每行末尾不使用分隔符的值

我正在浏览“ Python 用于数据分析”一书,在“示例: 2012年联邦选举委员会数据库”部分读取数据到 DataFrame 时遇到了麻烦。问题在于,数据的其中一列总是被设置为索引列,即使 index _ coll 参数被设置为 Nothing。

下面是到数据的链接: http://www.fec.gov/disclosurep/PDownload.do

下面是加载代码(为了节省检查时间,我设置 nrows = 10) :

import pandas as pd
fec = pd.read_csv('P00000001-ALL.csv',nrows=10,index_col=None)

为了简短起见,我排除了数据列的输出,但下面是我的输出(请不要使用 Index 值) :

In [20]: fec


Out[20]:
<class 'pandas.core.frame.DataFrame'>
Index: 10 entries, C00410118 to C00410118
Data columns:
...
dtypes: float64(4), int64(3), object(11)

下面是本书的输出(同样不包括数据列) :

In [13]: fec = read_csv('P00000001-ALL.csv')
In [14]: fec
Out[14]:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 1001731 entries, 0 to 1001730
...
dtypes: float64(1), int64(1), object(14)

我输出中的 Index 值实际上是文件中的第一列数据,然后将所有其余数据向左移动一个。有人知道如何防止这一列数据被列为索引吗?我希望索引只是 + 1增加整数。

我对蟒蛇和熊猫还是很陌生的,所以我为给你们带来的不便表示歉意。谢谢。

218613 次浏览

快速回答

如果在每行的末尾都有分隔符,可以使用 index_col=False而不是 index_col=None来关闭索引列推断并丢弃最后一列。

更多细节

在查看数据之后,在每一行的末尾都有一个逗号。下面这段引文(文档自本文创建以来已经过编辑) :

Index _ col: 列号、列名或列号/名称列表,用作结果 DataFrame 的索引(行标签)。默认情况下,它将不使用任何列对行进行编号,除非数据列比标题多一列,在这种情况下,第一列将作为索引。

文件显示,熊猫认为你有 n 个标题和 n + 1个数据列,并把第一列作为索引。


EDIT 10/20/2014-更多资讯

我发现 另一个有价值的入口特别关注拖尾限制器,以及如何简单地忽略它们:

如果一个文件的数据列数多于列名数,则第一列将用作 DataFrame 的行名: ..。

通常,您可以使用 index _ coll 选项来实现此行为。

在某些异常情况下,如果在每个数据行的末尾都使用分隔符来准备文件,则会使解析器感到困惑。若要显式禁用索引列推断并丢弃最后一列,请传递 index _ col= False: ..。

Re: crigts 的响应,对于任何在 index _ colFalse 或 Nothing 参数使用上有困难的人,比如在你试图去掉一个范围索引的情况下,你可以使用一个整数来指定你想用作索引的列。例如:

df = pd.read_csv('file.csv', index_col=0)

上面将第一列设置为索引(在我的“常见情况”中不添加范围索引)。

更新

考虑到这个答案的受欢迎程度,我想我应该添加一些背景/演示:

# Setting up the dummy data
In [1]: df = pd.DataFrame({"A":[1, 2, 3], "B":[4, 5, 6]})


In [2]: df
Out[2]:
A  B
0  1  4
1  2  5
2  3  6


In [3]: df.to_csv('file.csv', index=None)
File[3]:
A  B
1  4
2  5
3  6

读取时不使用 index _ coll 或者无/False 都将导致范围索引:

In [4]: pd.read_csv('file.csv')
Out[4]:
A  B
0  1  4
1  2  5
2  3  6


# Note that this is the default behavior, so the same as In [4]
In [5]: pd.read_csv('file.csv', index_col=None)
Out[5]:
A  B
0  1  4
1  2  5
2  3  6


In [6]: pd.read_csv('file.csv', index_col=False)
Out[6]:
A  B
0  1  4
1  2  5
2  3  6

然而,如果我们指定“ A”(第0列)实际上是索引,我们可以避免范围索引:

In [7]: pd.read_csv('file.csv', index_col=0)
Out[7]:
B
A
1  4
2  5
3  6

如果熊猫把你的第一行当作头,你可以这样使用头 = 无:

df = pd.read_csv ("csv-file.csv", header=None)

这样,熊猫就会像对待其他行一样对待你的第一行。