You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python pandas根据RT/RW/Kelurahan三列条件新建Zoning Status列

原代码问题
  • 判断语法错误:代码中y == [2,5,...]、z == ['Batu Ampar']是拿单个单元格的数值/字符串,和整个Python列表做相等比较,结果永远为False,导致所有行都会被判定为Zonasi3。
  • 匹配逻辑错误:分开判断RT属于某列表、RW属于某列表,会出现跨位置组合错配(比如RT12配RW5不属于Zonasi1,但按原逻辑会被误判),必须以(RT,RW)成对的形式做匹配才准确。
正确实现方案

优先使用pandas向量化写法,运行效率远高于手写for循环,适配任意数据规模:

import numpy as np

# 定义两个分区对应的(RT, RW)成对组合集合,和你给出的示例组合一一对应
zonasi1_pairs = {(12,2), (15,5), (7,4), (11,4), (11,2), (10,2), (9,2), (14,2)}
zonasi2_pairs = {(1,4), (9,3), (6,5), (5,5), (8,2), (15,2), (17,2), (1,6), (10,4), (13,4), (4,4), (6,4), (12,4)}

# 构造匹配条件
is_batu_ampar = df_51['Kelurahan'] == 'Batu Ampar'
match_zonasi1 = is_batu_ampar & df_51.apply(lambda row: (row['RT'], row['RW']) in zonasi1_pairs, axis=1)
match_zonasi2 = is_batu_ampar & df_51.apply(lambda row: (row['RT'], row['RW']) in zonasi2_pairs, axis=1)

# 生成新列
df_51['Zoning Status'] = np.select(
    condlist=[match_zonasi1, match_zonasi2],
    choicelist=['Zonasi 1', 'Zonasi 2'],
    default='Zonasi 3'
)

如果需要沿用for循环的写法,修正后代码如下:

status_zonasi = []
zonasi1_pairs = {(12,2), (15,5), (7,4), (11,4), (11,2), (10,2), (9,2), (14,2)}
zonasi2_pairs = {(1,4), (9,3), (6,5), (5,5), (8,2), (15,2), (17,2), (1,6), (10,4), (13,4), (4,4), (6,4), (12,4)}

for rt, rw, kelurahan in zip(df_51['RT'], df_51['RW'], df_51['Kelurahan']):
    if kelurahan == 'Batu Ampar' and (rt, rw) in zonasi1_pairs:
        res = 'Zonasi 1'
    elif kelurahan == 'Batu Ampar' and (rt, rw) in zonasi2_pairs:
        res = 'Zonasi 2'
    else:
        res = 'Zonasi 3'
    status_zonasi.append(res)

df_51['Zoning Status'] = status_zonasi

后续如果需要调整分区对应的RT/RW组合,直接修改对应集合内的(RT,RW)元组即可,无需改动判断逻辑。

内容的提问来源于stack exchange,提问作者linggapratama28

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 17:45:37