基于跨行条件创建Pandas布尔列:对比同区域隔年Geometry值
问题:基于同区域两年前的几何数据创建条件列
现有Pandas DataFrame包含Year(年份)、District(区域)、Geometry(几何数据,GeometryArray类型)列,需新增一列判断当前行的Geometry是否与同一区域两年前的Geometry相同(例如1902年101区域对比1900年101区域的几何数据),返回布尔值。
用户尝试的代码(存在逻辑与语法问题):
df['geometry change from last year'] = np.where(df['geometry'].at[df.index[i]]!= climate[geometry].at[df.index[i-2]], 'True', 'False')
示例数据:
| Year | District | Geometry | TRUE/FALSE |
|---|---|---|---|
| 1900 | 101 | POLYGON ((-89.26355 41.32246, -89.26171 41.322... | TRUE |
| 1902 | 101 | POLYGON ((-89.26355 41.33246, -89.26171 41.322... | FALSE |
解决方案
核心思路
由于年份可能不连续(如示例中无1901年数据),直接用shift()移位会导致匹配错误,因此采用合并关联的方式,精准匹配同区域、年份差2的几何数据后再对比。
步骤与代码
- 排序数据:确保同区域内年份按升序排列
df = df.sort_values(['District', 'Year']).reset_index(drop=True)
- 创建临时关联表:将年份减2,保留区域和对应年份的几何数据
temp_df = df[['District', 'Year', 'Geometry']].copy() temp_df['Year'] = temp_df['Year'] - 2 temp_df = temp_df.rename(columns={'Geometry': 'geometry_2years_ago'})
- 关联原表与临时表:匹配同区域、年份差2的记录
df = df.merge(temp_df, on=['District', 'Year'], how='left')
- 生成条件列:对比当前几何数据与两年前的数据,返回布尔值
# 生成布尔值列(推荐使用,更适合后续数据处理) df['geometry_change'] = df['Geometry'] != df['geometry_2years_ago'] # 若需字符串格式的TRUE/FALSE df['geometry_change_str'] = df['geometry_change'].astype(str).str.upper()
结果说明
- 无两年前数据的行(如示例中1900年记录),
geometry_2years_ago为NaN,由于NaN与任何值对比均返回True,符合示例中的TRUE结果 - 有两年前数据的行(如1902年记录),会精准对比同区域对应年份的几何数据,返回正确布尔值
内容的提问来源于stack exchange,提问作者SturgeonNW
相关产品推荐
相关产品推荐

