Pandas表查找

2024-05-08 01:39:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个熊猫查找表,如下所示

Grade   Lower_Boundary  Upper_Boundary
1   -110    -96
2   -96 -91
3   -91 -85
4   -85 -81
5   -81 -77
6   -77 -72
7   -72 -68
8   -68 -63
9   -63 -58
10  -58 -54
11  -54 -50
12  -50 -46
13  -46 -42
14  -42 -38
15  -38 -34
16  -34 -28
17  -28 -18
18  -18 -11
19  -11 -11
20  -11 -9

我有另一个熊猫数据框,看起来包含分数。我想通过查找查找表将“Grade”分配给score列。因此,应根据得分落下的上下边界的间隔,从查找表中的该行分配等级。有没有一种方法可以在不输入一堆if-then-else语句的情况下完成呢?我在考虑excel的索引匹配。

Score   Grade
-75 6
-75 6
-60 9
-66 8
-66 8
-98 1
-60 9
-82 4
-70 7
-60 9
-60 9
-60 9
-56 10
-70 7
-70 7
-70 7
-66 8
-56 10
-66 8
-66 8

Tags: 数据方法间隔if情况语句upperlower
1条回答
网友
1楼 · 发布于 2024-05-08 01:39:39

一行解决方案(我称之为查找表lookup):

df['Score'].apply(lambda score: lookup['Grade'][(lookup['Lower_Boundary'] <= score) & (lookup['Upper_Boundary'] > score)].values[0])

说明

对于给定的分数,以下是如何找到分数:

score = -75
match = (lookup['Lower_Boundary'] <= score) & (lookup['Upper_Boundary'] > score)
grade = lookup['Grade'][match]

这返回一个长度为1的序列。可以通过以下方法获取其值:

grade.values[0]

你需要做的就是apply上面的score列。如果需要一行代码,请使用lambda函数:

df['Score'].apply(lambda score: lookup['Grade'][(lookup['Lower_Boundary'] <= score) & (lookup['Upper_Boundary'] > score)].values[0])

否则,以下内容将更具可读性:

def lookup_grade(score):
    match = (lookup['Lower_Boundary'] <= score) & (lookup['Upper_Boundary'] > score)
    grade = lookup['Grade'][match]
    return grade.values[0]

df['Score'].apply(lookup_grade)

这种方法还可以使在找不到匹配项时更容易处理案例。

相关问题 更多 >