对数据框的行进行排序并获取 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
我的数据框如下所示:
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