如果我有一个Python Pandas DataFrame,其中包含两列人物和序列,分别为:
people sequence
John 1
Rob 2
Bob 3
如何返回序列最大的人?在此示例中,我想返回“鲍勃”
答案 0 :(得分:1)
pandas.Series.idxmax
是一种告诉您索引值出现最大值的方法。
然后使用它来获取另一列的值。
df.at[df['sequence'].idxmax(), 'people']
'Bob'
我喜欢评论中提供的解决方案@ user3483203。我提供一个不同的原因是为了表明相同的想法可以用更少的对象创建。
在这种情况下,df['sequence']
正在访问内部存储的对象,然后在其上调用idxmax
方法。那时,我们正在使用df
访问器访问数据帧at
中的特定单元格。
我们可以看到我们正在访问内部存储的对象,因为我们可以通过两种不同的方式访问它并验证它是同一对象。
df['sequence'] is df.sequence
True
而
df['sequence'] is df.sequence.copy()
False
另一方面,df.set_index('people')
创建一个新对象,这很昂贵。
很明显,这是在一个非常小的数据集上,但是:
%timeit df.loc[df['sequence'].idxmax(), 'people']
%timeit df.at[df['sequence'].idxmax(), 'people']
%timeit df.set_index('people').sequence.idxmax()
10000 loops, best of 3: 65.1 µs per loop
10000 loops, best of 3: 62.6 µs per loop
1000 loops, best of 3: 556 µs per loop
在更大的数据集上:
df = pd.DataFrame(dict(
people=range(10000),
sequence=np.random.permutation(range(10000))
))
%timeit df.loc[df['sequence'].idxmax(), 'people']
%timeit df.at[df['sequence'].idxmax(), 'people']
%timeit df.set_index('people').sequence.idxmax()
10000 loops, best of 3: 107 µs per loop
10000 loops, best of 3: 101 µs per loop
1000 loops, best of 3: 816 µs per loop
相对差异是一致的。