我正在阅读“Python for Data Analysis”一书,并在“示例: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相当新,所以对于给您带来的任何不便,我深表歉意。感谢。
答案 0 :(得分:51)
如果在每行末尾都有分隔符来关闭索引列推断并丢弃最后一列,请使用 index_col = False 而不是index_col = None。
查看数据后,每行末尾都有一个逗号。这句话:
来自the documentation的index_col:列号,列名或列号/名称列表,用作生成的DataFrame的索引(行标签)。默认情况下,它会对行进行编号而不使用任何列,除非有多个数据列而不是标题,在这种情况下,第一列将作为索引。
表明,pandas认为你有n个标题和n + 1个数据列,并将第一列视为索引。
EDIT 10/20/2014 - 更多信息
我发现another valuable entry特别关于尾随限制器以及如何忽略它们:
如果文件的列数据多于列名数,则第一列将用作DataFrame的行名:...
通常,您可以使用index_col选项来实现此行为。
在每个数据行的末尾都准备了带分隔符的文件时会出现一些异常情况,这会使解析器感到困惑。要显式禁用索引列推断并丢弃最后一列,请传递index_col = False:...
答案 1 :(得分:20)
Re:craigts的回复,对于任何在使用index_col的False或None参数时遇到问题的人,例如在你试图摆脱范围索引的情况下,你可以使用integer,指定要用作索引的列。例如:
df = pd.read_csv('file.csv', index_col=0)
以上将第一列设置为索引(而不是在我的&#34;常见情况&#34;中添加范围索引)。
鉴于这个答案的流行,我想我会添加一些上下文/演示:
# 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
但是,如果我们指定&#34; A&#34; (第0列)实际上是索引,我们可以避开范围索引:
In [7]: pd.read_csv('file.csv', index_col=0)
Out[7]:
B
A
1 4
2 5
3 6