如何用df.loc为Pandas DataFrame添加多条件判断列?
用df.loc添加条件标记列的正确实现
错误代码分析
尝试代码1问题:
你把赋值操作的结果(字符串'Yes')直接赋值给了df_new,导致df_new不是修改后的DataFrame,而是'Yes'。同时仅给符合条件的行设置了'Yes',未满足条件的行的'Ind'列会是NaN,不符合预期。尝试代码2问题:
loc的语法使用错误,第二个参数是列索引,你传入了行级的布尔掩码,这会导致列筛选逻辑混乱(布尔掩码是用来筛选行的,不是列),最终无法生成正确的标记列。
正确实现方法
方法1:先初始化默认值,再用loc更新符合条件的行(推荐)
这种方式逻辑清晰,完全贴合df.loc的使用场景:
import pandas as pd from io import StringIO csvfile_now = StringIO( """ Name A B C D Mike 5 11 50 10 Kate 60 9 20 19 Jane 11 14 20 12 """) df = pd.read_csv(csvfile_now, sep='\t', engine='python') # 初始化新列'Ind'为默认值'No' df['Ind'] = 'No' # 使用loc定位满足条件的行,将'Ind'列设为'Yes' df.loc[(df['B'] > df['A'] * 0.5) & (df['D'] > df['C'] * 0.5), 'Ind'] = 'Yes' print(df)
运行结果:
Name A B C D Ind 0 Mike 5 11 50 10 No 1 Kate 60 9 20 19 No 2 Jane 11 14 20 12 Yes
方法2:结合np.where与loc(可选)
如果不想提前初始化列,也可以用np.where生成标记值,再通过loc赋值:
import numpy as np # 直接生成'Ind'列的所有值 df.loc[:, 'Ind'] = np.where((df['B'] > df['A'] * 0.5) & (df['D'] > df['C'] * 0.5), 'Yes', 'No')
结果说明
- Mike:B=11满足
>5*0.5,但D=10不满足>50*0.5,标记为No - Kate:B=9不满足
>60*0.5,即使D=19满足条件,整体仍标记为No - Jane:B=14满足
>11*0.5且D=12满足>20*0.5,标记为Yes
内容的提问来源于stack exchange,提问作者Mark K
相关产品推荐
相关产品推荐

