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
相关产品推荐
相关产品推荐

