cJc
cJc

Reputation: 863

How do I get nlargest rows without the sorting?

I need to extract the n-smallest rows of a pandas df, but it is very important to me to maintain the original order of rows.

code example:

import pandas as pd
df = pd.DataFrame({
    'a': [1, 10, 8, 11, -1],
    'b': list('abdce'),
    'c': [1.0, 2.0, 1.5, 3.0, 4.0]})
df.nsmallest(3, 'a')

Gives:

   a  b    c
4 -1  e  4.0
0  1  a  1.0
2  8  d  1.5

I need:

   a  b    c
0  1  a  1.0
2  8  d  1.5
4 -1  e  4.0

Any ideas how to do that?

PS! In my real example, the index is not sorted/sortable as they are strings (names).

Upvotes: 4

Views: 460

Answers (1)

piRSquared
piRSquared

Reputation: 294318

Simplest approach assuming index was sorted in the beginning

df.nsmallest(3, 'a').sort_index()

   a  b    c
0  1  a  1.0
2  8  d  1.5
4 -1  e  4.0

Alternatively with np.argpartition and iloc

This doesn't depend on sorting the index.emphasized text

df.iloc[np.sort(df.a.values.argpartition(3)[:3])]

   a  b    c
0  1  a  1.0
2  8  d  1.5
4 -1  e  4.0

Upvotes: 4

Related Questions