2013-06-26 49 views
0

我是熊貓新手,並試圖學習如何使用它。在嘗試使用我在我的數據上的wes視頻和筆記本之一中看到的示例時,我遇到了問題。我有一個CSV文件看起來像這樣:使用熊貓groupby方法的數據幀鍵控

filePath,vp,score 
E:\Audio\7168965711_5601_4.wav,Cust_9709495726,-2 
E:\Audio\7168965711_5601_4.wav,Cust_9708568031,-80 
E:\Audio\7168965711_5601_4.wav,Cust_9702445777,-2 
E:\Audio\7168965711_5601_4.wav,Cust_7023544759,-35 
E:\Audio\7168965711_5601_4.wav,Cust_9702229339,-77 
E:\Audio\7168965711_5601_4.wav,Cust_9513243289,25 
E:\Audio\7168965711_5601_4.wav,Cust_2102513187,18 
E:\Audio\7168965711_5601_4.wav,Cust_6625625104,-56 
E:\Audio\7168965711_5601_4.wav,Cust_6073165338,-40 
E:\Audio\7168965711_5601_4.wav,Cust_5105831247,-30 
E:\Audio\7168965711_5601_4.wav,Cust_9513082770,-55 
E:\Audio\7168965711_5601_4.wav,Cust_5753907026,-79 
E:\Audio\7168965711_5601_4.wav,Cust_7403410322,11 
E:\Audio\7168965711_5601_4.wav,Cust_4062144116,-70 

我把它加載到數據幀和組是通過「文件路徑」和「VP」,代碼:

res = df.groupby(['filePath','vp']).size()  
res.index 

和輸出是:

[E:\Audio\7168965711_5601_4.wav     Cust_2102513187, 
Cust_4062144116,         Cust_5105831247, 
Cust_5753907026,         Cust_6073165338, 
Cust_6625625104,         Cust_7023544759, 
Cust_7403410322,         Cust_9513082770, 
Cust_9513243289,         Cust_9702229339, 
Cust_9702445777,         Cust_9708568031, 
Cust_9709495726] 

現在我試着去接近指數像字典,正如我在例子中看到的,但是,當即時通訊做

res['Cust_4062144116'] 

我得到一個錯誤:

KeyError: 'Cust_4062144116' 

我做成功獲得IM把文件路徑時的結果,但據我所知,並在previouse例子中看到的,我應該能夠使用VP鍵以及,心不是是這樣嗎?

對不起,如果它是一個微不足道的,我只是不明白爲什麼它在一個例子,但不在其他。

回答

1

Rutger你是不正確的。可以對multiIndex系列進行「部分」索引。我只是做錯了。

索引第一級是文件名(例如上面的E:\ Audio \ 7168965711_5601_4.wav),第二級是vp。意思是,對於每個文件名我有多個vps。 現在,這是正確的:

res['E:\Audio\7168965711_5601_4.wav] 

將返回: Cust_2102513187 2 Cust_4062144116 8 ....

而是試圖通過內部指標指數(該指數Cust_)將失敗。

0

你分組兩列,因此得到一個MultiIndex作爲回報。這意味着您還必須將這些列切片,而不是使用單個索引值。

您在groupby對象上的.size()將其轉換爲Series。如果你強迫它在數據幀可以使用.xs方法切單級:

res = pd.DataFrame(df.groupby(['filePath','vp']).size()) 
res.xs('Cust_4062144116', level=1) 

工程。如果你想保持它作爲一個系列,布爾索引可以幫助,是這樣的:

res[res.index.get_level_values(1) == 'Cust_4062144116'] 

最後一個選項是有點不太可讀,但有時也更flexibile,你可以同時測試多個值,例如:

res[res.index.get_level_values(1).isin(['Cust_4062144116', 'Cust_6073165338'])] 
+0

明白了,謝謝! – idoda