我正在尝试为每个具有两个属性(列)值等于“开”的参与者(用行表示)添加分数“ 1”。
但是,即使两个单元格都包含“ On”,这也不会分配1分。
有没有更简单的解决方案?
for row in reduction.itertuples():
if str(reduction['q1-1']) == "On" and str(reduction['q1-2']) == "On":
q1 = 1
else:
q1 = 0
print(q1)
答案 0 :(得分:0)
如果需要新列q
,请创建布尔掩码并将其强制转换为整数:
reduction = pd.DataFrame({
'q1-1': ['On','On','Off','Off'],
'q1-2': ['On','Off','On','Off']
})
mask = (reduction['q1-1'].astype(str) == "On") & (reduction['q1-2'].astype(str) == "On")
#alternative
mask = (reduction[['q1-1','q1-2']].astype(str) == "On").all(axis=1)
reduction['q'] = mask.astype(int)
print (reduction)
q1-1 q1-2 q
0 On On 1
1 On Off 0
2 Off On 0
3 Off Off 0
替代方法的说明:
将子集选择的广播列转换为字符串,并按DataFrame.eq
==
进行比较:
print (reduction[['q1-1','q1-2']].astype(str) == "On")
q1-1 q1-2
0 True True
1 True False
2 False True
3 False False
然后检查all
的值是否为每行True
:
print ((reduction[['q1-1','q1-2']].astype(str) == "On").all(axis=1))
0 True
1 False
2 False
3 False
dtype: bool
答案 1 :(得分:0)
q1
在循环中没有意义。 print
也不更新数据帧。如果您想使用循环,则需要使用pd.DataFrame.loc
,例如:
for row in df[['q1-1', 'q1-2']].itertuples():
if (row[1] == 'On') and (row[2] == 'On'):
df.loc[row.Index, 'Score'] = 1
但这是低效的,因为它在Python级循环中迭代每一行。对于Pandas,您应该寻求矢量化解决方案:
mask = reduction[['q1-1', 'q-2']].astype(str).eq('On').all(1)
reduction['score'] = mask.astype(int)