Python Pandas:满足条件时修改DataFrame的函数问题排查与修复
Python DataFrame 条件修改问题修复
需求说明
仅对DataFrame的A-C列进行评估:
- 若某行的A-C列中任意值大于3,则给该行的A-C列所有值加3
- 同时将该行的
NEW_BINARY列设为1
原代码问题分析
原自定义函数two_chng存在多个核心错误:
- 参数与调用逻辑错配:定义了
self参数但未使用,apply调用时无法正确传递行/列数据,函数也没有返回值用于修改DataFrame - 判断逻辑错误:
(df[cols[i]]>3).any未加括号调用方法,实际是判断方法对象而非布尔值;且该判断针对整列而非单行,导致整列只要有一个值大于3就全列批量加3 - 循环方向错误:遍历列的方式无法实现按行判断的需求,直接修改全局
df会导致错误的批量赋值 apply用法错误:默认按列处理,但需求是按行判断,完全不符合逻辑
修复后的代码实现
方法1:按行遍历(新手友好,逻辑直观)
import pandas as pd df = pd.DataFrame({'A': [0, 1, 2, 3, 4], 'B': [0, 6, 7, 8, 9], 'C': [1, 2, 3, 4, 5], 'D': ['a', 'b', 'c', 'd', 'e'], 'E': ['f', 1, 2, 'd', 'e']}) # 初始化NEW_BINARY列 df['NEW_BINARY'] = 0 # 遍历每一行索引 for idx in df.index: # 检查当前行A-C列是否有任意值大于3 if (df.loc[idx, ['A', 'B', 'C']] > 3).any(): # 给当前行A-C列加3 df.loc[idx, ['A', 'B', 'C']] += 3 # 设置NEW_BINARY为1 df.loc[idx, 'NEW_BINARY'] = 1 print(df)
方法2:向量化操作(Pandas推荐风格,效率更高)
import pandas as pd df = pd.DataFrame({'A': [0, 1, 2, 3, 4], 'B': [0, 6, 7, 8, 9], 'C': [1, 2, 3, 4, 5], 'D': ['a', 'b', 'c', 'd', 'e'], 'E': ['f', 1, 2, 'd', 'e']}) # 生成标记:哪些行需要修改 mask = df[['A', 'B', 'C']].gt(3).any(axis=1) # 对符合条件的行A-C列加3 df.loc[mask, ['A', 'B', 'C']] += 3 # 将布尔标记转为整数,赋值给NEW_BINARY df['NEW_BINARY'] = mask.astype(int) print(df)
验证结果
运行上述代码后,输出与期望结果完全一致:
A B C D E NEW_BINARY 0 0 0 1 a f 0 1 1 9 2 b 1 1 2 2 10 3 c 2 1 3 6 11 7 d d 1 4 7 12 8 e e 1
内容的提问来源于stack exchange,提问作者Python Newbie
相关产品推荐
相关产品推荐

