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是将符合条件的数据进行替代
posted @ 2023-02-16 17:24  小杨的冥想课  阅读(87)  评论(0编辑  收藏  举报