Zen*_*ega 7 python lookup pandas
我有一个像这样的pandas查找表
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
Run Code Online (Sandbox Code Playgroud)
我有另一个看起来包含得分的熊猫数据框.我想通过查找查找表将"成绩"分配给分数列.因此,根据分数下降和上限的间隔,应从查找表中的该行分配等级.有没有办法在不输入if if 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
Run Code Online (Sandbox Code Playgroud)
一行解决方案(我称之为查找表lookup):
df['Score'].apply(lambda score: lookup['Grade'][(lookup['Lower_Boundary'] <= score) & (lookup['Upper_Boundary'] > score)].values[0])
Run Code Online (Sandbox Code Playgroud)
说明:
对于给定的分数,以下是如何找到分数:
score = -75
match = (lookup['Lower_Boundary'] <= score) & (lookup['Upper_Boundary'] > score)
grade = lookup['Grade'][match]
Run Code Online (Sandbox Code Playgroud)
这将返回一系列长度1.例如,您可以获取其值:
grade.values[0]
Run Code Online (Sandbox Code Playgroud)
您需要做的就是apply上面的得分列.如果你想要一个单行,请使用一个lambda函数:
df['Score'].apply(lambda score: lookup['Grade'][(lookup['Lower_Boundary'] <= score) & (lookup['Upper_Boundary'] > score)].values[0])
Run Code Online (Sandbox Code Playgroud)
否则以下内容会更具可读性:
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)
Run Code Online (Sandbox Code Playgroud)
这种方法还可以在没有找到匹配时更容易处理案例.
| 归档时间: |
|
| 查看次数: |
8981 次 |
| 最近记录: |