我正在尝试创建一个循环,以基于布尔比较创建许多变量。我一次要查看三个变量,并根据观察值是1,2还是三个来创建标记。
当我尝试查看3个变量时出现错误。奇怪的是,使用1或2可以正常工作。我什至尝试使用两次相同的变量(以检查与变量无关),但这也不起作用。这是关于添加第三个变量的事情。
生成相似的数据集
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
我正试图将其循环(因为我有很多年和标志)
years= [2014, 2015, 2016, 2017, 2018]
var = ['_Flag']
for i in years:
for k in var:
results.loc[("results.Pre_BF_" + str(i) + str(k) == 1) &
("results.BF_" + str(i) + str(k) == 0) & ("results.XMAS_"+ str(i) +
str(k) == 0), 'Combo_2014_Pre_BF_Only'] = 1
这显示了错误
KeyError:“不能使用单个布尔值索引到setitem中”
当我对第三个条件进行硬编码时,它可以正常工作。
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个条件的事情。
关于这里发生的事情有什么想法吗?
答案 0 :(得分:1)
注意。 "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 :(得分:0)
select * from
(select *,row_number() over(partition by name,address order by time desc) rn
) t where t.rn=1
或
results['Pre_BF_2014_Flag'] & results['BF_2014_Flag'] & results['XMAS_2014_Flag']