在pandas中选择时忽略重复索引

时间:2017-05-03 14:57:09

标签: python python-3.x pandas

这是一个有点简单的问题,如果答案显而易见,请原谅我。从数据框中选择可能包含或不包含重复索引值的数据的最佳方法是什么?例如:

> 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进行异常处理,或者我可以在选择之前尝试清理数据框,但这两种方法对我来说似乎有点笨拙,我想知道是否有更好的东西。

1 个答案:

答案 0 :(得分: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

然而,只要您尝试分配并且只是获得一个值,那么这很好

这将返回单行的每个col值,但

更详细的方法,但应该更快,是使用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

这将返回偏向左侧的切片