2013-10-25 294 views
22

我們如何獲得一系列特定的過濾行?從熊貓數據框中獲取特定的系列行

實施例數據幀:

>>> df = pd.DataFrame({'date': [20130101, 20130101, 20130102], 'location': ['a', 'a', 'c']}) 
>>> df 
     date location 
0 20130101  a 
1 20130101  a 
2 20130102  c 

我需要選擇行,其中locationc爲一系列

我想:

row = df[df["location"] == "c"].head(1) # gives a dataframe 
row = df.ix[df["location"] == "c"]  # also gives a dataframe with single row 

在這兩種情況下,我不能行作爲系列。

回答

36

使用squeeze功能將數據幀中刪除一個維度:如果所得到的數據幀是:當設置爲True

df[df["location"] == "c"].squeeze() 
Out[5]: 
date  20130102 
location   c 
Name: 2, dtype: object 

DataFrame.squeeze方法作用於read_csv功能的擠壓參數相同的方式一個1-len數據幀,即它只有一個維度,就像它是一個列或一行,然後該對象被壓縮到較小的維度對象。在你的情況下,你從DataFrame獲得一個Series對象。如果將面板擠壓到DataFrame上,則適用相同的邏輯。

擠壓在你的代碼中是明確的,並且清楚地表明你的意圖是「放下」手中的對象,因爲它的尺寸可以投影到更小的尺寸。

如果數據幀有多個列或行,擠壓沒有效果。

+0

謝謝Boud這就像一個奇蹟。 'df [df [「location」] ==「c」]。squeeze()'也可以正常工作。你能否也解釋一下擠壓? 「擠壓長度1維」意味着它將1行結果轉換爲系列? – Pratyush

+0

@Pratyush我更新了上面的答案。我建議你調用squeeze,因爲你想從1D數據框中獲得一系列,這比僅僅爲了投射目的調用iloc [0]更明確。 – Boud

+1

不知道哪一個更好,但擠壓pythonic :) +1解釋 –

9

你可以只取第一行用整數索引(iloc()功能):

>>> df[df["location"] == "c"].iloc[0] 
date  20130102 
location   c 
Name: 2, dtype: object 
+0

感謝羅馬,這工作得很好。 – Pratyush