2017-05-03 77 views
0

這是一個有點簡單的問題,如果答案很明顯,請原諒我。從可能包含或不包含重複索引值的數據框中選擇數據的最佳方法是什麼?例如:在熊貓中選擇時忽略重複索引

> foo = pd.DataFrame([[1,2], [3,4], [5,6]], index=['a','a','b'], columns=['x','y']) 
> foo 
    x y 
a 1 2 
a 3 4 
b 5 6 

通常當我做一個選擇我所期望的價值退還給我是一個整數(或者準確的說一個numpy.int64)。例如foo.at['b','x']正確地返回值5.但是,在我正在閱讀的表格有重複索引的罕見情況下,這不起作用。例如,foo.at['a','x']返回一個[1,3]的數組,這將導致我的代碼後面的問題。現在我總是可以從數組中選取一個整數,例如foo.at['a','x'][0],但是如果我嘗試使用非數組結果(例如foo.at['b','x'][0])執行此操作,則此方法會出錯。

是否有一種靈活,快速的方法,保證每次我嘗試從數據框中選擇數據時都返回一個整數值? (例如,通過忽略每個重複的索引值。)我可以想出一些方法來解決我遇到的問題。例如,我可以使用try和except來做異常處理,或者我可以在選擇數據框之前嘗試清理數據框,但這兩種方法對我來說似乎有點笨拙,我想知道是否還有更好的方法。

回答

0

你可以使用head(1)然後再轉選擇感興趣的山坳:

In [40]: 
foo.loc['a'].head(1)['x'] 

Out[40]: 
a 1 
Name: x, dtype: int64 

In [39]: 
foo.loc['b'].head(1)['x'] 

Out[39]: 
x 5 
Name: b, dtype: int64 

然而,只要你想分配回來,纔剛剛一個值,那麼這是罰款

這將返回每個山坳值單行雖然

一個更詳細的方法,但應該更快是使用index.get_slice_bound

In [50]: 
foo['x'].iloc[foo.index.get_slice_bound('a', side='left', kind='loc')] 

Out[50]: 
1 

In [51]: 
foo['x'].iloc[foo.index.get_slice_bound('b', side='left', kind='loc')] 

Out[51]: 
5 

這會返回偏向左側的切片