Python Pandas如何基于另一DataFrame的区间条件更新指定列值
错误原因
你写的代码报错有两个核心问题:
apply传入的参数是df1['location']列的值,你实际需要判断的是latitude列的数值,参数对象就错了- 直接拿长度不同的两个Series做
between比较,pandas要求做逐元素比较的Series索引和长度必须一致,所以抛出ValueError
实现方法
这里提供3种不同场景下的实现方案:
方案1:小规模数据适用,直接逐行匹配
def match_location(lat): res = df2[(df2["min_latitude"] <= lat) & (df2["max_latitude"] >= lat)] return res["location"].iloc[0] if not res.empty else pd.NA df1["location"] = df1["latitude"].apply(match_location)
方案2:区间无重叠且有序时适用,性能更高的pd.cut实现
# 构造区间分箱和对应的标签 bins = sorted(df2["min_latitude"].tolist() + df2["max_latitude"].tolist()) labels = df2.sort_values("min_latitude")["location"].tolist() df1["location"] = pd.cut( df1["latitude"], bins=bins, labels=labels, include_lowest=True )
方案3:大规模数据适用,pandas 2.2+ 条件合并实现
df1 = df1.merge( df2, how="left", condition=[ df1["latitude"] >= df2["min_latitude"], df1["latitude"] <= df2["max_latitude"] ] )[["location", "latitude"]]
以上任意一种方案运行后都可以得到你预期的输出结果。
内容的提问来源于stack exchange,提问作者gaphalpa
相关产品推荐
相关产品推荐

