python - Pandas 中每行的前 3 个值

标签 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) 返回第一个最大列名,但我不确定如何计算其他两个?

如有任何帮助,我们将不胜感激,谢谢!

最佳答案

使用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

或者如果性能不重要,请使用 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())

关于python - Pandas 中每行的前 3 个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54923349/

相关文章:

python - 如何合并不同嵌套级别的嵌套字典?

python - 当生产类构造函数采用额外参数时,为什么 unittest.mock 会失败?

python - 隔离重复列值

python - 删除 pandas 数据框中具有多个关联的条目?

python - Numpy 空列表类型推断

python - 寻求目录树数据表示的优雅设计

python - 传感器重启后继续进行 ID 计数

Python IO 不可哈希列表正则表达式

r - R 中是否有一个函数同时具有 bind_rows() 和 bind_cols()?

python - 在行中填充数据框中的无值 Pandas Python