pandas数据选取4(query/eval/filter/where/mask)
#query函数
a = {"name":["lemon","jack","peter","Emma","james"],
"city":["长沙","上海","深圳","北京","北京"],
"a":[80,90,60,73,89],
"b":[80,75,80,85,83],
"c":[70,75,80,73,62]}
df = pd.DataFrame(data=a,index=["d","e","f","g","h"])
a = df.query('name == "lemon"') #里面是一个字符串类型,列名称又没有双引号
#对于数字类型的进行判断
a = df.query('a == 80')
a = df.query('a > b')
a = df.query('a > b')#选取a列大于b列的数据行
#在query函数中,支持通过变量进行筛选
my_name = "lemon"
a = df.query("name == @my_name")
#对于字符串,支持从列表中筛选出多个值
a = df.query('name == ["lemon","peter"]')
#对于多个条件的判断
a = df.query("a>80 & b<90") #两者都需要满足的
a = df.query("a>80 and b<90") #与楼上一致
a = df.query("a>80 | b<90") #两者满足一个即可的
a = df.query("a>80 or b<90") #与楼上一致
#对于列名称中有特殊符号或者空格时,需要通过反引号将列名包裹起来
df_1 = df.rename(columns={"name":"use name"})
a = df_1.query('`use name` == "lemon"')
print(a)
#eval函数
#eval函数
#eval函数与query类似
#对于条件判断eval返回的是布尔型
e = df.eval("a>b")
"""
d False
e True
f False
g False
h True
dtype: bool
"""
#对于加减乘除会返回一个Seris
e = df.eval("a+b")
e = df.eval("e = a+b")#返回的结果为一个新的数据框,新增一列e,e的值为a+b,但是此时数据框df是没有发生变化的
e = df.eval("e = a+b",inplace = True)#inplace改变原有数据框
#此外eval还支持同时设置多个数学计算表达式
e = df.eval("""e = a+b
f = a+c""")#注意书写格式!
#同手也支持通过变量来使用表达式
k = 10
e = df.eval("d = a + @k") #添加符号@
#filter函数,索引名称筛选
#参数解释
filter(
self: NDFrameT,
items=None,#索引名称中是否包含设定的内容
like: str | None = None, #用来模糊指定索引名称中是否包含设定的内容
regex: str | None = None,#运用正则表达式来模糊指定索引名称中是否包含设定的内容
axis=None,
fl = df.filter(items=["e","g"],axis=0)#筛选行索引中含有字母“e”或“g”的行
"""
name city a b c
e jack 上海 90 75 75
g Emma 北京 73 85 73
"""
# fl = df.filter(items=["e","g"])#在不设置axis时,返回的是一个只有行索引的数据框,
fl = df.filter( like = "e")#列索引中包含字母“e”的所有列,可以不用设置默认值
fl = df.filter( like = "e",axis=0)#列索引中包含字母“e”的所有的行,
#通过正则表达式可以更加灵活的进行筛选
fl = df.filter( regex = "e",axis=0)
fl = df.filter( regex = "^n",axis=1)
print(fl)
#where函数
#参数解释
here( # type: ignore[override]
self,
cond,#条件设置参数
other=lib.no_default,#替代值得设置,默认为NA
inplace: bool = False,#是否在原数据框上进行修改
axis: Axis | None = None,
level: Level = None,#多重索引,可以设置索引的层级
errors: IgnoreRaise | lib.NoDefault = "raise",
try_cast: bool | lib.NoDefault = lib.no_default,
)
#对于series
s.where(s>75,other=0)#针对series筛选出s值大于75的,不符合的用0代替
a = {"name":["lemon","jack","peter","Emma","james"],
"city":["长沙","上海","深圳","北京","北京"],
"a":[80,90,60,73,89],
"b":[80,75,80,85,83],
"c":[70,75,80,73,62]}
df = pd.DataFrame(data=a,index=["d","e","f","g","h"])
df3 = df[["a","b","c"]]
m = df3 % 2 == 0
a = df3.where(m,-df3)#判断df3中的数是否为偶数,如果不满足便取负数
#也可以只对数据框中的某列进行操作
m1 = df3["a"] > 80
a = df3.where(m1)#a列大于80的行保留其余的全用NaN值替代
print(a)
#mask函数
#mask的操作与where函数类似,不同的是mask是将符合条件的数据进行替代
记录学习的点点滴滴