2017-02-14 131 views
0

我需要以下問題幫助多個csv文件。加載和重塑與熊貓

我有多個CSV文件像下面

1.csv

ID Length 
1 12 
2 23 
3 44 
3 34 
5 11 
3 39 
7 79 
8 45 
9 56 
0 15 
1 35 
2 23 
3 66 
4 33 
1 12 
7 34 
1 21 
3 43 
6 44 
9 55 

2.csv

ID Length 
1 52.1 
2 32.2 
3 44.6 
3 99.1 
5 122.3 
3 43.2 
7 79.4 
8 45.5 
9 56.3 
0 15.4 
1 35.7 
2 23.7 
3 66.7 
4 33.8 
1 12.9 
7 34.8 
1 21.6 
3 43.7 
6 44.2 
9 55.8 

我想每個10行重塑列Length,並把它並排在一個結果旁邊。下面 例如是我想要的輸出

[[12 23 44 34 11] [[ 52.1 32.2 44.6 99.1 122.3] 
[39 79 45 56 15]] [ 43.2 79.4 45.5 56.3 15.4]] 
[[35 23 66 33 12] [[ 35.7 23.7 66.7 33.8 12.9] 
[34 21 43 44 55]] [ 34.8 21.6 43.7 44.2 55.8]] 

我用下面的腳本嘗試,但它給了我一個類型的錯誤。

myscript.py

import pandas as pd 
import glob 

df = [pd.read_csv(filename) for filename in glob.glob("Users/Ling/workspace/testing/*.csv")] 

start = 0 
for i in range(0, len(df.index)): 
    if (i + 1)%10 == 0: 
     result = df['Length'].iloc[start:i+1].reshape(2,5) 
     start = i + 1 
     print result 

錯誤

TypeError: object of type 'builtin_function_or_method' has no len() 

我不理解的錯誤。我應該在start = 0之後放置另一個For loop以便程序讀取每個文件,或者有另一種方法可以解決此問題嗎?

謝謝你的幫助。

[UPDATE]

隨着從@cmaher建議,我修改myscript.py是這樣

import pandas as pd 
import glob 

df = [pd.read_csv(filename) for filename in glob.glob("Users/Ling/workspace/testing/*.csv")] 

df = pd.concat(df) 
start = 0 
for i in range(0, len(df.index)): 
    if (i + 1)%10 == 0: 
     result = df['Length'].iloc[start:i+1].reshape(2,5) 
     start = i + 1 
     print result 

輸出是這樣

[[ 52.1 32.2 44.6 99.1 122.3] 
[ 43.2 79.4 45.5 56.3 15.4]] 
[[ 35.7 23.7 66.7 33.8 12.9] 
[ 34.8 21.6 43.7 44.2 55.8]] 
[[ 12. 23. 44. 34. 11.] 
[ 39. 79. 45. 56. 15.]] 
[[ 35. 23. 66. 33. 12.] 
[ 34. 21. 43. 44. 55.]] 

其是從什麼不同我期望。我想像我在所需的輸出中提供的那樣並排放置。

+0

它告訴你,'df.index'的是,沒有一個'LEN()'方法的功能。 'df'看起來像什麼? 'df.index'看起來像什麼? – Batman

+0

@Batman最初的劇本其實是這樣的,我加載一個CSV文件只'DF = pd.read_csv(「1.csv」)'。爲了回答你的問題,我認爲'df.index'這裏的意思是1.csv中所有數據的列表。 – Ling

+0

你是否需要它們在交互式shell中對它們進行視覺檢查?還是有更大的理由,你需要他們在這種特定的格式?他們需要成爲一個列表,numpy數組,還是這很重要? – Jarad

回答

1

正如您所寫,df是DataFrame的列表,而不是DataFrame,因此.index是對列表方法.index()的引用。您for循環之前,只需添加df = pd.concat(df)(見http://pandas.pydata.org/pandas-docs/stable/generated/pandas.concat.html),這是專爲拼接大熊貓對象的序列建立了一個類的方法。

編輯:這裏是你的代碼與所添加的一步

df = [pd.read_csv(filename) for filename in glob.glob("Users/Ling/workspace/testing/*.csv")] 

df = pd.concat(df) 

start = 0 
for i in range(0, len(df.index)): 
    if (i + 1)%10 == 0: 
     result = df['Length'].iloc[start:i+1].reshape(2,5) 
     start = i + 1 
     print result 
+0

你能更多地討論'之前,你的循環,只需添加DF = pd.concat(DF)' ?你的意思是把'df = pd.concat(df)'放在'in for範圍內(0,len(df.index())'? – Ling

+0

這是正確的 - 我轉發了你的代碼和額外的步驟 – cmaher

+0

我做了你的建議,但它返回了以下錯誤---'ValueError:沒有對象連接' – Ling