如何遍历Pandas DataFrame列时结合另一列设置条件?
解决方案
你当前的elif条件写法完全错误,when不是Python的合法语法,而且也没正确获取同组内Q=0对应的POS_X基准值。结合你的数据结构,每组是按abb字段划分的(A、B、C各自成组,每组从Q=0开始),下面给你两种可行方案:
步骤1:先添加组内基准POS_X列
不管用循环还是向量化操作,都需要先给每行标记出所在组Q=0时的POS_X基准值:
# 提取所有Q=0的行,建立abb到基准POS_X的映射 base_map = df_a[df_a['Q'] == 0].set_index('abb')['POS_X'] # 给原DataFrame新增基准列 df_a['base_POS_X'] = df_a['abb'].map(base_map)
执行后你的DataFrame会新增base_POS_X列,每组的所有行都会对应本组Q=0的POS_X值:
name abb POS_X POS_Y Q Max Q base_POS_X 0 A A 15.6 19.4 0 2 15.6 1 A-x A 12.6 19.4 1 2 15.6 2 A-y2 A 18.6 19.4 2 2 15.6 3 B B 15.0 25.0 0 2 15.0 4 B-a B 12.0 25.0 1 2 15.0 5 B-d B 18.0 25.0 2 2 15.0 6 C C 15.0 10.0 0 3 15.0 7 C-x1 C 12.0 10.0 1 3 15.0 8 C-c4 C 18.0 10.0 2 3 15.0 9 C-a C 11.0 10.0 3 3 15.0
方案1:修正循环逻辑
如果一定要保留索引遍历的写法,现在可以直接用新增的基准列做判断:
for idx in df_a.index: q_val = df_a['Q'][idx] pos_x = df_a['POS_X'][idx] base_pos = df_a['base_POS_X'][idx] if q_val == 0: # 执行Q=0对应的操作 print(f"处理Q=0的行:{df_a.loc[idx]['name']}") elif q_val != 0 and pos_x > base_pos: # 执行POS_X大于基准值的操作 print(f"POS_X超基准的行:{df_a.loc[idx]['name']}") else: # 执行其他情况的操作 print(f"其他情况的行:{df_a.loc[idx]['name']}")
方案2:高效向量化写法(推荐)
Pandas原生不建议用循环遍历,用向量化条件判断速度更快,尤其适合大数据量:
# 标记Q=0的行的操作结果 q0_mask = df_a['Q'] == 0 df_a.loc[q0_mask, 'operation'] = "执行Q=0的操作" # 标记Q≠0且POS_X>基准的行的操作结果 cond_mask = (df_a['Q'] != 0) & (df_a['POS_X'] > df_a['base_POS_X']) df_a.loc[cond_mask, 'operation'] = "执行POS_X大于基准的操作" # 填充剩余行的操作结果 df_a['operation'] = df_a['operation'].fillna("执行其他操作")
内容的提问来源于stack exchange,提问作者maxwell_742
相关产品推荐
相关产品推荐

