2012-10-10 18 views
1

我正在嘗試使用熊貓在平坦的數據源上執行數據分析。具體來說,我試圖完成的是相當於SQL中的Union All查詢。聯合使用python熊貓的所有類型查詢

我使用read_csv()方法輸入數據,輸出具有唯一的整數索引和大約30列。

這些列中有幾列包含標識信息,而其他列包含數據。

總共,前6列包含唯一標識條目的標識信息。在這6列後面有一系列引用該值的列(A,B ...等)。這些列中的一些以集合的形式鏈接在一起,例如(A,B,C)屬於一起,就像(D,E,F)一樣。 (D,E,F)也與(A,B,C)如下((A,D),(B,E),(C,F))相關。 什麼,我試圖做的是採取具有如下我的數據集:

(id1,id2,id3,id4,id5,id6,A,B,C,D,E,F) 

,並返回以下

((id1,id2,id3,id4,id5,id6,A,B,C), 
(id1,id2,id3,id4,id5,id6,D,E,F)) 

這裏,A和d鏈接它們包含在同一列中。

(注意,這是一個簡化的,也有在總數據集中約12萬個獨特的組合)

我一直在嘗試使用合併,CONCAT和連接功能,都無濟於事。我覺得我錯過了一些至關重要的東西,比如在SQL數據庫中,我可以簡單地執行聯合所有查詢(這確實很慢)來解決這個問題。

我在這個階段沒有工作示例代碼。

基於一些熊貓文檔編寫此問題的另一種方法。

left = key lval 
right = key rval 
merge(left, right, on=key) = key, lval, rval 

相反,我想:

left = kev, lval 
right = key, lval 
union(left, right) = key, lval 
        key, rval 

我不知道,如果一個新的索引鍵的值將需要爲此創建。

回答

0

我已經能夠完成我最初要求的。 然而,它確實需要一些列名稱的按摩。

解決方案(使用僞代碼):

設置dataframes有關數據。例如

left = (id1,id2,id3,id4,id5,id6,A,B,C) 
right = (id1,id2,id3,id4,id5,id6,D,E,F) 
middle = (id1,id2,id3,id4,id5,id6,G,H,I) 

注意,在這裏,對我來說這個數據集導致具有每一標識的非唯一索引鍵我。也就是說,左右各行都有一個關鍵字。

重命名列名稱。

col_names = [id1,id2,id3,id4,id5,id6,val1,val2,val3] 
left.columns = col_names 
right.columns = col_names 
middle.columns = col_names 

串連這些

pieces = [left, right, middle] 
new_df = concat(pieces) 

現在,這將創建一個包含X的獨特索引值以及3項新的數據幀。這不是很理想,但現在它會做,這個主要的缺點是你不能唯一訪問一個單一的入口行,他們會進來三倍。要訪問數據,您可以根據唯一的ID值創建新的數據框。

例如

check_df = new_df[(new_df[id1] == 'id1') & (new_df[id2] == 'id2') ... etc]) 
print check_df 

key, id1, id2, id3, id4, id5, id6, A, B, C 
key, id1, id2, id3, id4, id5, id6, D, E, F 
key, id1, id2, id3, id4, id5, id6, G, H, I 

現在,這不是很理想,但它是我需要的一些其他分析的格式。它可能不適用於所有方面。

如果任何人有更好的解決方案,請分享它,我相對較新的使用python與熊貓。

+0

你可以使用keys參數作爲concat,這將導致一個MultiIndex並且允許你唯一地選擇數據:concat(件,鍵= ['left','middle','right']。設置(id1,...,id6)作爲索引,這將減少選擇數據的冗長。 –