对数据框的行进行排序并获取 pandas 数据框中的列值

Sort the rows of a dataframe and get the column values in pandas dataframe

我的数据框如下所示:

df
      5     1     2     4    3     0    pred_val true_value rank 
  0  0.3   0.2   0.1   0.5  0.25  0.4      4        2        6
  1  0.36  0.24  0.12  0.5  0.45  0.4      4        3        2  

我想根据我的真实值预测排名列的值。如果预测值 (pred_val) 与 true_value 相同,则排名 = 1,这可以通过使用 np.where 来实现。但是,如果它们不匹配,则在从 0-5 命名的所有列中搜索 true_value。并且这个真实值根据它下面的单元格值被赋予等级。

比如第0行真值是2和pred_value是4不匹配,那么我们在第2列中搜索它的值为0.1,这是所有0-5列中最低的第 0 行的值,因此排名第 6。

我该怎么做?

我想这就是您要找的东西

df

       5     1     2      4     3    0  pred_val    true_value
0    0.3   0.2   0.1    0.5  0.25  0.4         4             2
1   0.36  0.24  0.12    0.5  0.45  0.4         4             3 


df['rank'] = df.apply(lambda row: row[[0,1,2,3,4,5]].sort_values(ascending=False).index.get_loc(row.true_value) + 1, axis=1)
df

       5       1       2      4     3     0  pred_val   true_value  rank
0    0.3     0.2     0.1    0.5  0.25   0.4         4            2     6
1   0.36    0.24    0.12    0.5  0.45   0.4         4            3     2

输入:

    5        1       2       4   3       0  pred_val    true_value  rank
0   0.30    0.20    0.10    0.5 0.25    0.4   4           2          0
1   0.36    0.24    0.12    0.5 0.45    0.4   4           3          0

这样做,

for i in range(len(df)):
    t_val = df['true_value'][i]
    cols_vals = sorted(list(df.loc[i, ['5', '1', '2', '4', '3', '0']].values), reverse = True)
    rank = cols_vals.index(df[str(t_val)][i]) + 1
    df.loc[i, 'rank'] = rank

输出:

     5       1       2       4   3       0  pred_val true_value rank
0   0.30    0.20    0.10    0.5 0.25    0.4   4       2          6
1   0.36    0.24    0.12    0.5 0.45    0.4   4       3          2

如果你想使用列表理解:

# set a string
df['truevalue'] = df['truevalue'].astype(str)

# list comprehension to get (index,col) pairs
vals = [x for x in enumerate(df['truevalue'])]

# use rank and list comprehension
df['rank'] = [int(df[df.columns[:6].values].rank(1, ascending=False).loc[val]) for val in vals]

      5     1     2    4     3    0  predval truevalue  rank
0  0.30  0.20  0.10  0.5  0.25  0.4        4         2     6
1  0.36  0.24  0.12  0.5  0.45  0.4        4         3     2