2017-05-03 72 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 

这会返回偏向左侧的切片