Python 熊猫弄乱了DataFrame.from_csv上的日期列
我正在使用Python3.4.0,pandas==0.16.2。我有CSV文件中的足球队结果,其中包含以下列:日期、地点、goals.scored、goals.lost、result。“at”列可以有三个值(H、A、N)中的一个,分别表示比赛是在球队的主场、客场还是在中立地进行。以下是其中一个文件的标题:Python 熊猫弄乱了DataFrame.from_csv上的日期列,python,date,csv,pandas,Python,Date,Csv,Pandas,我正在使用Python3.4.0,pandas==0.16.2。我有CSV文件中的足球队结果,其中包含以下列:日期、地点、goals.scored、goals.lost、result。“at”列可以有三个值(H、A、N)中的一个,分别表示比赛是在球队的主场、客场还是在中立地进行。以下是其中一个文件的标题: date,at,goals.scored,goals.lost,result 16/09/2014,A,0,2,2 01/10/2014,H,4,1,1 22/10/2014,A,2,1,1
date,at,goals.scored,goals.lost,result
16/09/2014,A,0,2,2
01/10/2014,H,4,1,1
22/10/2014,A,2,1,1
04/11/2014,H,3,3,0
26/11/2014,H,2,0,1
09/12/2014,A,4,1,1
25/02/2015,H,1,3,2
17/03/2015,A,2,0,1
19/08/2014,A,0,0,0
当我以常规方式将此文件加载到pandas.DataFrame中时:
import pandas as pd
aTeam = pd.DataFrame.from_csv("teamA-results.csv")
前两列“date”和“at”似乎被视为一列,我得到的数据帧格式不正确,如下所示:
aTeam.dtypes
at object
goals.scored int64
goals.lost int64
result int64
dtype: object
aTeam
at goals.scored goals.lost result
date
2014-09-16 A 0 2 2
2014-01-10 H 4 1 1
2014-10-22 A 2 1 1
2014-04-11 H 3 3 0
2014-11-26 H 2 0 1
...
代码块没有清楚地反映出损坏情况,因此我附上了Jupyter笔记本的屏幕截图:
如您所见,“date”和“at”列似乎被视为对象类型的一列:
aTeam['at']
date
2014-09-16 A
2014-01-10 H
2014-10-22 A
2014-04-11 H
2014-11-26 H
2014-09-12 A
起初,我认为日期前后缺少引号是造成这个问题的原因,所以我添加了引号,但没有任何帮助,因此我引用了“at”列中的所有值,但仍然没有解决问题。我在CSV文件中尝试了单引号和双引号。有趣的是,在“date”和“at”中的值周围使用无引号或双引号可以产生与上面相同的结果。单引号被解释为“at”列中值的一部分,但不在日期列中:
添加parse_dates=True
参数对数据帧没有任何影响
在R中使用这些CSV文件时,我没有遇到此类问题。我将非常感谢您在这方面的帮助。我可以使用from\u CSV复制您的问题,问题是它使用列0作为索引,因此传递
index\u col=None
将起作用:
索引列:int或sequence,默认为0
用于索引的列。如果给定序列,则使用多索引。不同于read_表的默认值
输出:
date at goals.scored goals.lost result
0 16/09/2014 A 0 2 2
1 01/10/2014 H 4 1 1
2 22/10/2014 A 2 1 1
3 04/11/2014 H 3 3 0
4 26/11/2014 H 2 0 1
5 09/12/2014 A 4 1 1
6 25/02/2015 H 1 3 2
7 17/03/2015 A 2 0 1
8 19/08/2014 A 0 0 0
date at goals.scored goals.lost result
0 16/09/2014 A 0 2 2
1 01/10/2014 H 4 1 1
2 22/10/2014 A 2 1 1
3 04/11/2014 H 3 3 0
4 26/11/2014 H 2 0 1
5 09/12/2014 A 4 1 1
6 25/02/2015 H 1 3 2
7 17/03/2015 A 2 0 1
8 19/08/2014 A 0 0 0
使用Odr。根据您尝试的quotechar
这是一个有效的参数,它可以正常工作,并且可能是您想要的:
import pandas as pd
aTeam = pd.read_csv("in.csv")
输出:
date at goals.scored goals.lost result
0 16/09/2014 A 0 2 2
1 01/10/2014 H 4 1 1
2 22/10/2014 A 2 1 1
3 04/11/2014 H 3 3 0
4 26/11/2014 H 2 0 1
5 09/12/2014 A 4 1 1
6 25/02/2015 H 1 3 2
7 17/03/2015 A 2 0 1
8 19/08/2014 A 0 0 0
date at goals.scored goals.lost result
0 16/09/2014 A 0 2 2
1 01/10/2014 H 4 1 1
2 22/10/2014 A 2 1 1
3 04/11/2014 H 3 3 0
4 26/11/2014 H 2 0 1
5 09/12/2014 A 4 1 1
6 25/02/2015 H 1 3 2
7 17/03/2015 A 2 0 1
8 19/08/2014 A 0 0 0
我在这里没有问题(使用Python2.7、16.2)。我使用了您粘贴的文本,在我的桌面上创建了一个.csv文件,并使用两种方法将其加载到Pandas中
import pandas as pd
a = pd.read_csv('test.csv')
b = pd.DataFrame.from_csv('test.csv')
>>>a
date at goals.scored goals.lost result
0 16/09/2014 A 0 2 2
1 01/10/2014 H 4 1 1
2 22/10/2014 A 2 1 1
3 04/11/2014 H 3 3 0
4 26/11/2014 H 2 0 1
5 09/12/2014 A 4 1 1
6 25/02/2015 H 1 3 2
7 17/03/2015 A 2 0 1
8 19/08/2014 A 0 0 0
>>>b
at goals.scored goals.lost result
date
2014-09-16 A 0 2 2
2014-01-10 H 4 1 1
2014-10-22 A 2 1 1
2014-04-11 H 3 3 0
2014-11-26 H 2 0 1
2014-09-12 A 4 1 1
2015-02-25 H 1 3 2
2015-03-17 A 2 0 1
2014-08-19 A 0 0 0
在如何处理索引方面,您可以看到read_csv和from_csv命令之间的不同行为。然而,我看不到任何像你提到的问题。您可以尝试进一步定义read_csv参数,尽管我怀疑这会产生实质性的影响
您能否通过aTeam['at']查询数据帧,确认您的日期和“at”列被粉碎在一起,并查看结果如何?我在帖子中添加了aTeam['at']的输出。看起来这里没有问题。您的索引名为“date”,这就是为什么在查询aTeam['at']时会显示“date”,但这只是索引。根据EdChum的建议,切换到read_csv,如上面的示例“a”所示。我想如果你做一个aTeam.descripe()你会发现一切都井然有序。你的解释似乎是正确的,很可能这就是为什么将index\u col=None添加到from\u csv解决了问题。我永远也不知道为什么我的答案会被否决。所以有时候对我来说可能是个谜……只是说,@tknepp那-1不是我的。我无法重现你的错误,1。不要使用csv中的
,因为它不再被更新,请使用熊猫。阅读csv,2。来自csv的的index\u col
参数默认为index\u col=0
这就是第一列被视为索引的原因。当我加载您的数据时,我将日期作为索引,而不是'date'和'at'@Padraig,我删除了对read_csv doc页面的引用,因为它们是不相关的-我不想包含它。@Padraig:好吧!index_col=None解决了这个问题。谢谢。@Padraic,但即使添加index_col=None也不能解决这个问题。我不相信他的专栏会像声称的那样被粉碎,相反,当加载from_csv时,索引被命名为“date”,他感到困惑。您能确认这些列实际上是连接在一起的吗?@tnknapp,添加index_col=None确实解决了这个问题,date不再被视为索引,因此不确定您要添加什么mean@Padraic,当然,但OP认为索引和第一列被连接到一列中,我无法复制。如果你能重现这个问题,那将是非常有趣的。