2016-04-22 75 views
2

我使用熊貓數據框來操縱數據,我通常將它們視爲虛擬電子表格,並使用行和列來定義各個單元格的位置。我很滿意切片和切塊數據框的方法,但是當數據框包含單行時,似乎有些奇怪的行爲。基本上,我想從滿足特定條件的大型父數據框中選擇數據行,然後將這些結果作爲子女數據框傳遞給單獨的函數以供進一步處理。有時,父數據框中只有一條記錄符合定義的條件,因此,女兒數據框將只包含一行。儘管如此,我仍然需要能夠以與父數據庫相同的方式訪問女兒中的數據。爲了說明可能指向,考慮下面的數據幀:在一行中訪問熊貓數據框中的數據

import pandas as pd 
tempDF = pd.DataFrame({'group':[1,1,1,1,2,2,2,2], 
         'string':['a','b','c','d','a','b','c','d']}) 
print(tempDF) 

看起來像:

group string 
0  1  a 
1  1  b 
2  1  c 
3  1  d 
4  2  a 
5  2  b 
6  2  c 
7  2  d 

作爲一個例子,我現在可以選擇那些行,其中「基團」 == 2和「字符串」 = ='c',只產生一行。正如預期的那樣,數據幀的長度爲1,並且它是可以打印使用.IX()在原始數據幀基於索引值只是一個單一的細胞:

tempDF2 = tempDF.loc[((tempDF['group']==2) & (tempDF['string']=='c')),['group','string']] 
print(tempDF2) 
print('Length of tempDF2 = ',tempDF2.index.size) 
print(tempDF2.loc[6,['string']]) 

輸出:

group string 
6  2  c 
Length of tempDF2 = 1 
string c 

然而,如果我使用.loc選擇一行,那麼數據框將以轉置形式打印,並且數據框的長度現在爲2(而不是1)。顯然,它已經不再可能基於原始父數據幀的指數來選擇單個單元格的值:

tempDF3 = tempDF.loc[6,['group','string']] 
print(tempDF3) 
print('Length of tempDF3 = ',tempDF3.index.size) 

輸出:

group  2 
string c 
Name: 7, dtype: object 
Length of tempDF3 = 2 

在我看來,這兩種方法實際上是在做同樣的事情,即選擇一行數據。但是,在第二個示例中,行和列轉置,使得無法以預期的方式提取數據。

爲什麼這兩種行爲都存在?將一行數據幀轉換爲默認行爲的意義何在?我怎樣才能確保包含單行的數據框在我將其傳遞給另一個函數時不會發生轉置?

+0

''tempDF.loc [6:6]'解決你的問題? – MaxU

+0

我想第二個實際上是返回一個ndarray而不是 – fernandezcuesta

+0

@MaxU - 是的,那也行。謝謝回覆。 – user1718097

回答

3
tempDF3 = tempDF.loc[6,['group','string']] 

.loc選擇的第一位置6決定了返回類型將是一個系列,因此您的問題。相反使用[6]

tempDF3 = tempDF.loc[[6],['group','string']] 
+0

所以我猜想將列表傳遞給.loc()是需要遵循的規則。非常感謝 - 我可能一直在尋找幾個小時來找到這樣一個微妙的解決方案。 – user1718097

+1

我只注意到傳遞列表到loc非常慢。但是通過切片即.loc [6:6]速度快,並根據需要運作 –

+0

@AnatoliyOrlov這很有趣。我會亂了。謝謝你告訴我。 – piRSquared