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)返回第一个最大列名,但不确定如何计算其他两个?
在这方面的任何帮助将不胜感激,谢谢!
使用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)
归档时间: |
|
查看次数: |
735 次 |
最近记录: |