67

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

这是数据的链接: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)

为了简短起见,我排除了数据列输出,但这是我的输出(请不要索引值):

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)

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

我对 python 和 pandas 还很陌生,所以对于给您带来的不便,我深表歉意。谢谢。

4

3 回答 3

102

快速回答

当您在每行末尾有分隔符时使用index_col=False而不是index_col=None关闭索引列推断并丢弃最后一列。

更多详情

查看数据后,每行末尾都有一个逗号。还有这句话(自创建这篇文章以来,文档已被编辑):

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

文档中可以看出,pandas 认为您有 n 个标题和 n+1 个数据列,并将第一列视为索引。


编辑 2014 年 10 月 20 日 - 更多信息

我发现了另一个有价值的条目,专门关于尾随限制器以及如何简单地忽略它们:

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

通常,您可以使用 index_col 选项实现此行为。

当文件在每个数据行的末尾准备好分隔符时,会出现一些例外情况,这会使解析器感到困惑。要显式禁用索引列推断并丢弃最后一列,请传递 index_col=False: ...

于 2012-10-18T18:19:30.690 回答
77

回复:craigts 的回复,对于在 index_col 中使用 False 或 None 参数时遇到问题的任何人,例如在您试图摆脱范围索引的情况下,您可以改为使用整数来指定要使用的列作为索引。例如:

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_col 或使用 None/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
于 2017-06-09T15:29:41.560 回答
1

如果 pandas 将您的第一行视为标题,您可以使用 header = none :

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

这样,熊猫会将您的第一行视为任何行。

于 2021-10-07T02:05:44.730 回答