这实际上是两个数据框的故事,而且行为奇怪不同。
我有两个csv文件,我正在读大熊猫。每个文件都没有标题;头文件分开存储。像这样:
$ ls
A.csv A.header B.csv B.header
我使用pandas来阅读这些内容,但首先我需要解析标题:
def make_header(flnm):
return open(flnm, 'rb').read().strip(' \t\n\r').split(',')
A_header = make_header('A.header')
B_header = make_header('B.header')
现在我可以阅读csvs:
A = read_csv('A.csv', header=0, names=A_header)
B = read_csv('B.csv', header=0, names=B_header)
让我们确保这项工作正常:
print type(A)
print type(B)
结果是:
<class 'pandas.core.frame.DataFrame'>
<class 'pandas.core.frame.DataFrame'>
正如所料。
现在出现了我无法理解的陌生感。我想从每个数据框中选择一个列。当我这样做时,其中一个数据框返回一个Series对象(正如我所料),一个返回一列DataFrame:
print type(A.A_x)
print type(B.B_x)
结果:
<class 'pandas.core.series.Series'>
<class 'pandas.core.frame.DataFrame'>
据我所知,我从头到尾都对这些文件进行了相同的处理,但结果却不一样。可能是什么导致了这个?我对数据的处理或我对大熊猫的理解存在缺陷在哪里?
我调查的几件事
这两列具有相同的数据类型:
print A.A_x.dtype
print B.B_x.B_x.dtype
给出:
int64
int64
(当然,由于我观察到的奇怪行为,我必须从B数据框中选择两次列。)
我还检查了标题中的重复名称:
$ cat A.header | sed 's/,/\n/g' | grep A_x
> A_x
和
$ cat B.header | sed 's/,/\n/g' | grep B_x
> B_x
因此,每个名称都只出现一次。