2014-01-10 67 views
1

我使用.xs或.loc(他們似乎表現相同)通過索引提取我的數據框的一個子集。當我的條件檢索多行時,結果保留一個數據框。當只檢索一行時,它會自動轉換爲一系列。我不想要這種行爲,因爲這意味着我需要處理多個下游案例(可用於系列vs數據框的不同方法集)。如何在提取單個行時保留大熊貓數據框標識

In [1]: df = pd.DataFrame({'a':range(7), 'b':['one']*4 + ['two'] + ['three']*2, 
'c':range(10,17)}) 

In [2]: df.set_index('b', inplace=True) 

In [3]: df.xs('one') 
Out[3]: 
    a c 
b 
one 0 10 
one 1 11 
one 2 12 
one 3 13 

In [4]: df.xs('two') 
Out[4]: 
a  4 
c 14 
Name: two, dtype: int64 

In [5]: type(df.xs('two')) 
Out [5]: pandas.core.series.Series 

我可以在一系列手動轉換回數據幀,但似乎繁瑣,也需要用例測試,看看我是否應該這樣做。有沒有更簡潔的方法來重新開始數據框?

回答

6

IIUC,你可以簡單地加括號,[],並使用.loc

>>> df.loc["two"] 
a  4 
c 14 
Name: two, dtype: int64 
>>> type(_) 
<class 'pandas.core.series.Series'> 
>>> df.loc[["two"]] 
    a c 
b   
two 4 14 

[1 rows x 2 columns] 
>>> type(_) 
<class 'pandas.core.frame.DataFrame'> 

這可能提醒你的numpy高級索引是如何工作的:

>>> a = np.arange(9).reshape(3,3) 
>>> a[1] 
array([3, 4, 5]) 
>>> a[[1]] 
array([[3, 4, 5]]) 

現在,這可能需要一些重構的代碼,這樣即使列表只包含一個元素,您也總是可以訪問列表,但它在實踐中對我很有用。

相關問題