熊猫每行前三的值

qui*_*git 5 python dataframe pandas

我有一个大型的Pandas数据框,该框符合:

| ID | Var1 | Var2 | Var3 | Var4 | Var5 |
|----|------|------|------|------|------|
| 1  | 1    | 2    | 3    | 4    | 5    |
| 2  | 10   | 9    | 8    | 7    | 6    |
| 3  | 25   | 37   | 41   | 24   | 21   |
| 4  | 102  | 11   | 72   | 56   | 151  |
...
Run Code Online (Sandbox Code Playgroud)

并且我想生成看起来像这样的输出,并为每行取三个最大值的列名:

| ID | 1st Max | 2nd Max | 3rd Max |
|----|---------|---------|---------|
| 1  | Var5    | Var4    | Var3    |
| 2  | Var1    | Var2    | Var3    |
| 3  | Var3    | Var2    | Var1    |
| 4  | Var5    | Var1    | Var3    |
...
Run Code Online (Sandbox Code Playgroud)

我尝试使用df.idmax(axis = 1)返回第一个最大列名,但不确定如何计算其他两个?

在这方面的任何帮助将不胜感激,谢谢!

jez*_*ael 5

使用numpy.argsort与选择排序值的位置top3通过索引,最后把它传递给DataFrame构造函数:

df = df.set_index('ID')
df = pd.DataFrame(df.columns.values[np.argsort(-df.values, axis=1)[:, :3]], 
                  index=df.index,
                  columns = ['1st Max','2nd Max','3rd Max']).reset_index()
print (df)
   ID 1st Max 2nd Max 3rd Max
0   1    Var5    Var4    Var3
1   2    Var1    Var2    Var3
2   3    Var3    Var2    Var1
3   4    Var5    Var1    Var3
Run Code Online (Sandbox Code Playgroud)

或者,如果性能并不重要nlargest,则apply每行使用:

c = ['1st Max','2nd Max','3rd Max']
df = (df.set_index('ID')
        .apply(lambda x: pd.Series(x.nlargest(3).index, index=c), axis=1)
        .reset_index())
Run Code Online (Sandbox Code Playgroud)