我有一个大的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)返回第一个最大列名,但不确定如何计算其他两个?
在此方面的任何帮助将不胜感激,谢谢!
答案 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
或者如果性能不重要,则每行分别使用apply
和nlargest
:
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())