为什么我在Pandas中的列数据偏移了一位?

1 投票
5 回答
1954 浏览
提问于 2025-04-18 05:11

我正在使用Pandas这个库来处理文本,因为我觉得它比csv模块简单多了。现在遇到一个问题。我有一个.csv文件,里面有多个列:subtitletitledescription。下面是我如何访问每一列的内容。

colnames = ['subtitle', 'description', 'title']
data = pandas.read_csv('C:\Users\B\cwitems.csv', names=colnames)
subtit = list(data.subtitle)
desc = list(data.description)
title = list(data.title)

for line in zip(subtit, desc, title):
    print line

问题是,不知道为什么,当我打印line的时候,期待的副标题并没有打印出来。当我打印每个desc时,标题却出现了。而当我单独打印subtit时,描述又被打印出来。所以,看起来每一列的内容都错位了,少了一个。有没有人能解释一下这种情况?这是正常的吗?我该怎么避免这种情况呢?

5 个回答

-1

我遇到过类似的问题,结果发现我想下载的 .csv 文件在表头的最后没有逗号,但其他每一行的末尾都有逗号。把 index_col 设置为 False(而不是默认的 index_col=None)可以强制 pandas 创建一个索引列,而不是自己推测一个索引,这样我的数据就能正确对齐了。

0

看起来我解决了这个问题——虽然我在文档里没找到相关信息,所以也许有经验的Pandas用户能解释一下为什么或者是怎么回事。我自己是搞不清楚的。

我做的事情是:删除了一个没用的列(就是我.csv文件里的最后一列),然后索引就恢复到了正确的顺序。我不知道这个行为(或者说它的修正)是怎么回事——是和我的.csv文件有关,还是Pandas本身的问题(可能只有在处理文本时才会出现这种情况)。我也不清楚。

无论如何,我非常感谢大家的帮助!!这次我算是走运了。

1

我在使用 pd.read_csv 的时候加上了 index_col=False,现在没问题了。

1

我不确定这算不算答案,不过评论的字数太多了。你可以随意忽略它。

>>> from itertools import izip_longest
>>> 
>>> l1 = [1,2]
>>> l2 = [1,2,3,4,5]
>>> l3 = [1,2,3]
>>> 
>>> for line in izip_longest(l1,l2,l3):
...     print line

将会输出:

(1, 1, 1)
(2, 2, 2)
(None, 3, 3)
(None, 4, None)
(None, 5, None)
2

我觉得你是想加载一个有4列的文件,但你只给了3个列名。如果你只想加载前3列,可以使用

data = pandas.read_csv('C:\Users\B\cwitems.csv', names=colnames, usecols=[0,1,2])

你不需要在文件中删除未使用的列。

默认情况下,read_csv会加载所有列,而在你的情况下,列数等于列名加1,所以第一列会被当作数据框的索引。剩下的列都会往后移一位。

撰写回答