使用pandas对多列应用IF条件,匹配经纬度后将指定val字段置零
报错原因
你遇到的报错有两个核心触发点:
- pandas中对布尔Series做逻辑与运算不能使用Python原生的
and关键字,and会尝试将整个Series转为单个布尔值,不符合pandas的逐行判断逻辑,因此触发歧义报错。你需要改用逐位与运算符&,且每个判断条件必须用小括号包裹,避免运算符优先级异常。 - 代码中列名大小写不匹配,你定义的列名是小写的
lon、lat,但筛选时用了大写开头的Lon、Lat,会额外触发键不存在的错误。
单组经纬度匹配实现
如果仅需要匹配单组经纬度,直接调整筛选逻辑和赋值的列范围即可:
import pandas as pd col_names=['id','lon','lat','val1','val2','val3'] # 替换为你的实际文件路径,如果文件第一行是表头请将header改为0 df = pd.read_csv("你的文件路径", sep='\s+', names=col_names, header=None) # 匹配lon=22且lat=38的行,将三个val字段统一置零 df.loc[(df['lon'] == 22) & (df['lat'] == 38), ['val1','val2','val3']] = 0
多组经纬度批量匹配实现
如果需要同时匹配多组经纬度(比如你举例的(22,38)和(23.5,39)),可以用批量匹配的写法,避免重复写判断条件:
import pandas as pd col_names=['id','lon','lat','val1','val2','val3'] df = pd.read_csv("你的文件路径", sep='\s+', names=col_names, header=None) # 定义所有需要匹配的经纬度对 target_points = [(22, 38), (23.5, 39)] # 批量筛选符合条件的行,置零所有val字段 df.loc[df[['lon', 'lat']].apply(tuple, axis=1).isin(target_points), ['val1','val2','val3']] = 0
内容的提问来源于stack exchange,提问作者Nat
相关产品推荐
相关产品推荐

