Pandas中Filter变量失效:修改数据后筛选结果异常
问题原因
你定义的filter1是静态布尔数组,它在赋值时就已经基于当时的DataFrame数据计算出了每行的True/False结果,之后即使DataFrame中的数据被修改,这个变量存储的布尔值不会自动更新。
比如你初始计算filter1时,符合条件的行(Austria那行)对应的位置是True;当你把该行的weight改为100后,filter1里的True值依然保留,所以用它筛选还是会返回原来的行。
解决方案
有几种方式可以解决这个问题,确保每次筛选都基于最新的DataFrame数据:
每次使用前重新计算过滤器
不要将过滤器结果存在变量里长期复用,每次筛选前重新计算条件:# 修改数据后,重新计算过滤器 filter1 = (df['weight'].str.slice(stop=2)=='65') & (df['country'].str.slice(stop=2)=='Au') df.loc[filter1]将过滤器封装为函数
把筛选逻辑写成函数,每次调用时传入当前的DataFrame,动态生成最新的布尔数组:def get_filter1(df): return (df['weight'].str.slice(stop=2)=='65') & (df['country'].str.slice(stop=2)=='Au') # 初始筛选 df.loc[get_filter1(df)] # 修改数据后,调用函数获取最新过滤器 df.loc[get_filter1(df)]使用
df.query()动态查询query()方法每次执行都会基于当前DataFrame的数据计算条件,适合动态筛选:# 初始筛选 df.query("weight.str.slice(stop=2) == '65' and country.str.slice(stop=2) == 'Au'") # 修改数据后直接再次查询,自动用最新数据计算 df.query("weight.str.slice(stop=2) == '65' and country.str.slice(stop=2) == 'Au'")
内容的提问来源于stack exchange,提问作者Brandon
相关产品推荐
相关产品推荐

