2015-07-21 65 views
1

我使用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

回答

0

我這裏沒有問題(使用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

2

我可以複製您的問題使用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