使用pandas按列返回n个最小索引

Nic*_*gan 13 python pandas

我有以下(简化)数据帧:

df = pd.DataFrame({'X': [1, 2, 3, 4, 5,6,7,8,9,10],
'Y': [10,20,30,40,50,-10,-20,-30,-40,-50],
'Z': [20,18,16,14,12,10,8,6,4,2]},index=list('ABCDEFGHIJ'))
Run Code Online (Sandbox Code Playgroud)

这给出了以下内容:

    X   Y   Z
A   1  10  20
B   2  20  18
C   3  30  16
D   4  40  14
E   5  50  12
F   6 -10  10
G   7 -20   8
H   8 -30   6
I   9 -40   4
J  10 -50   2
Run Code Online (Sandbox Code Playgroud)

我想创建一个新的数据帧,按列返回n个最小值的索引.

期望的输出(例如,3个最小值):

   X  Y  Z
0  A  J  J
1  B  I  I
2  C  H  H
Run Code Online (Sandbox Code Playgroud)

做这个的最好方式是什么?

Psi*_*dom 10

你可以用applynsmallest:

n = 3
df.apply(lambda x: pd.Series(x.nsmallest(n).index))

#   X   Y   Z
#0  A   J   J
#1  B   I   I
#2  C   H   H
Run Code Online (Sandbox Code Playgroud)


jez*_*ael 10

更快的numpy解决方案numpy.argsort:

N = 3
a = np.argsort(-df.values, axis=0)[-1:-1-N:-1]
print (a)
[[0 9 9]
 [1 8 8]
 [2 7 7]]

b = pd.DataFrame(df.index[a], columns=df.columns)
print (b)
   X  Y  Z
0  A  J  J
1  B  I  I
2  C  H  H
Run Code Online (Sandbox Code Playgroud)

时间:

In [111]: %timeit (pd.DataFrame(df.index[np.argsort(-df.values, axis=0)[-1:-1-N:-1]], columns=df.columns))
159 µs ± 1.37 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In [112]: %timeit (df.apply(lambda x: pd.Series(x.nsmallest(N).index)))
3.52 ms ± 49.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Run Code Online (Sandbox Code Playgroud)