看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
pandas 的 query() 方法,它可以像 SQL 一样传入字符串来进行查询,也可以用 @
符来使用变量。squeeze() 方法可以实现数据降维,将单值的 Series 变了标量。今天我们来看看这两个方法的实际使用。
本需求的源数据如下:
import pandas as pd
from io import StringIO
data0 = '''
deg,losal,hisal
1,1000,2000
2,2001,3000
3,3001,5000
'''
data = '''
deptno,name,sal
A,Lisa,1000
B,sala,1500
B,nisang,1700
B,wangf,1900
C,fanghua,2500
D,liufang,2700
D,mali,3500
'''
df0 = pd.read_csv(StringIO(data0))
df = pd.read_csv(StringIO(data))
有两个数据:
需求为在 df 中新增加一列,来显示在 df0 中所定义的等级
思路是用 df 中的薪资来查询 df0 表,查询到的数据取 deg 列的值。
我们这次使用 query() 方法,它可以像 SQL 一样传入字符串来进行查询,也可以用 @
符来使用变量。
先测试第一行 Lisa 的薪资 1000 来查询 df0 表:
df0.query('losal<=1000<=hisal')
'''
deg losal hisal
0 1 1000 2000
'''
得到了一行数据,取 deg 列:
df0.query('losal<=1000<=hisal').deg
'''
0 1
Name: deg, dtype: int64
'''
得到了单值的 Series,再用 squeeze() 方法降为标量:
df0.query('losal<=1000<=hisal').deg.squeeze()
# 1
得到了等级 1。可以将这个方法定义一个函数来用 map 调用。query() 中可以用 @
符来代表变量:
def get_deg(x: int) -> int:
ser = df0.query('losal<=@x<=hisal').deg
return ser.squeeze()
df.assign(deg=df.sal.map(get_deg))
'''
deptno name sal deg
0 A Lisa 1000 1
1 B sala 1500 1
2 B nisang 1700 1
3 B wangf 1900 1
4 C fanghua 2500 2
5 D liufang 2700 2
6 D mali 3500 3
'''
得到了最终结果。还可以把整个过程写成一行代码:
df.assign(deg=df.sal.map(lambda x: df0.query('losal<=@x<=hisal').deg.squeeze()))
也能得到同样的结果。
(完)
更新时间:2024-08-18 16:06:35 标签:pandas python 等级 标记