Python 如何在布尔比较中使用字符串引用
我试图创建一个循环,以基于布尔比较创建许多变量。我一次查看三个变量,并根据观察值是否有1、2或三个这些标志创建标志 我尝试查看3个变量时出错。奇怪的是,它只需要一两个就可以了。我甚至尝试过两次使用同一个变量(检查它是否与变量无关),但这也不起作用。它是关于添加第三个变量的 生成相似数据集Python 如何在布尔比较中使用字符串引用,python,string,pandas,boolean,Python,String,Pandas,Boolean,我试图创建一个循环,以基于布尔比较创建许多变量。我一次查看三个变量,并根据观察值是否有1、2或三个这些标志创建标志 我尝试查看3个变量时出错。奇怪的是,它只需要一两个就可以了。我甚至尝试过两次使用同一个变量(检查它是否与变量无关),但这也不起作用。它是关于添加第三个变量的 生成相似数据集 results = pd.DataFrame(np.random.randint(0,2,size=(20, 3)), columns=['Pre_BF_2014_Flag', 'BF_2014_Flag',
results = pd.DataFrame(np.random.randint(0,2,size=(20, 3)), columns=['Pre_BF_2014_Flag', 'BF_2014_Flag', 'XMAS_2014_Flag' ])
这是它看起来像硬编码的,这是有效的
results.loc[(results.Pre_BF_2014_Flag == 1) & (results.BF_2014_Flag == 0) &
(results.XMAS_2014_Flag == 0), 'Combo_2014_Pre_BF_Only'] = 1
我正试图把这个循环(因为我有很多年和国旗)
这显示了错误
KeyError:“无法使用单个布尔索引到集合项”
当我硬编码第三个条件时,它工作得很好
results.loc[("results.Pre_BF_" + str(i) + str(k) == 1) & ("results.BF_" + str(i) + str(k) == 0) & (results.XMAS_2014_Flag == 0), 'Combo_2014_Pre_BF_Only'] = 1
如果我使用这个XMAS变量作为第一个或第二个条件,它也可以工作。这只是关于使用3个条件
你知道这里发生了什么吗
results['Pre_BF_2014_Flag'] & results['BF_2014_Flag'] & results['XMAS_2014_Flag']
或
小心点<代码>“results.Pre_BF_”+str(i)+str(k)表示一个字符串,而不是一个序列。不能对字符串使用矢量化布尔索引
您可以按如下方式编写预期逻辑:
years= [2014, 2015, 2016, 2017, 2018]
var = ['_Flag']
for i in years:
for k in var:
m1 = results[f'Pre_BF_{i}{k}'] == 1
m2 = results[f'BF_{i}{k}'] == 0
m3 = results[f'XMAS_{i}{k}'] == 0
results.loc[m1 & m2 & m3, f'Combo_{i}_Pre_BF_Only'] = 1
更好的方法是通过直接赋值构造布尔级数:
results[f'Combo_{i}_Pre_BF_Only'] = m1 & m2 & m3
所需的输出是什么?另一个二进制标志(或1和NaN)称为“Combo_2014_Pre_BF_Only”,表明是否满足这三个条件。
years= [2014, 2015, 2016, 2017, 2018]
var = ['_Flag']
for i in years:
for k in var:
m1 = results[f'Pre_BF_{i}{k}'] == 1
m2 = results[f'BF_{i}{k}'] == 0
m3 = results[f'XMAS_{i}{k}'] == 0
results.loc[m1 & m2 & m3, f'Combo_{i}_Pre_BF_Only'] = 1
results[f'Combo_{i}_Pre_BF_Only'] = m1 & m2 & m3