熊猫弄乱DataFrame.from_csv上的日期列

熊猫弄乱DataFrame.from_csv上的日期列

问题描述:

我使用Python 3.4.0和pandas == 0.16.2。我有足球队的结果CSV文件,其中包含以下列:日期,在,目标.scored,goals.lost,结果。 'at'栏可以有三个值(H,A,N)中的一个,它们分别表示比赛是在球队主场,场外还是在中立位置进行的。这里有一个这样的文件头:熊猫弄乱DataFrame.from_csv上的日期列

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") 

前两列“日期”和“在”似乎是看作一个和我得到这样一个格式错误的数据帧:

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 columns corruption after csv_read

正如你可以“在”看“日期”和列似乎被当作对象类型的一列:

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'的值周围不使用引号或双引号可以产生与上面相同的结果。单引号被解释为“在”列中的值的部分,但不是在日期列:

enter image description here

添加parse_dates=True PARAM没有足够的数据帧产生任何影响。

当我在R中使用这些CSV文件时,我没有遇到过这样的问题。我将非常感谢这方面的任何帮助。

+0

我不能再现你的错误1.不要使用'from_csv'它不再被更新,使用'pandas.read_csv',2.'from_csv'的'index_col'参数默认为'index_col = 0'这就是为什么第一列被视为索引。当我加载你的数据时,我得到的日期作为索引不是'日期'和'在' – EdChum

我这里没有问题(使用Python 2.7,熊猫16.2)。我用您粘贴文本,并创建了我的桌面上.csv文件,使用两种方法

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']一起被粉碎在一起,并看看是什么产量?

+0

我在帖子中添加了一个team ['at']的输出。 – mac13k

+0

看起来这里没有问题。您的索引被命名为“date”,这就是为什么当查询一个Team ['at'时显示“date”,但这只是索引。根据EdChum的建议,切换到read_csv,如上面的示例“a”所示。我想如果你做一个team.describe(),你会看到一切都是按顺序的。 – tnknepp

+0

你的解释看起来是正确的,最有可能的就是为什么在from_csv中添加index_col = None解决了问题。 – mac13k

我可以复制您的问题使用from_csv,问题是它采用山坳0作为索引,以便通过index_col=None将工作:

index_colint或序列,默认为0

用于索引的列。如果给出序列,则使用MultiIndex。不同的默认从read_table

import pandas as pd 
aTeam = pd.DataFrame().from_csv("in.csv",index_col=None) 

输出:

  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使用。read_csv正常工作,是你根据你试图quotechar其实这是一个有效ARG可能想:

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 
+0

@Padraig确认:read_csv适合我。 – mac13k

+0

@ mac13k,设置'index_col = None'也应该可以工作 –

+0

@Padraig我删除了对read_csv文档页面的引用,因为它们是不相关的 - 我不好意思包含它。 – mac13k