熊猫每行前三的值

时间:2019-02-28 10:22:34

标签: python pandas dataframe

我有一个大的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  |
...

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

| ID | 1st Max | 2nd Max | 3rd Max |
|----|---------|---------|---------|
| 1  | Var5    | Var4    | Var3    |
| 2  | Var1    | Var2    | Var3    |
| 3  | Var3    | Var2    | Var1    |
| 4  | Var5    | Var1    | Var3    |
...

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

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

1 个答案:

答案 0 :(得分:3)

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

或者如果性能不重要,则每行分别使用applynlargest

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())