Python评分熊猫,字符串验证

时间:2018-10-02 10:17:53

标签: python pandas iterator

我正在尝试为每个具有两个属性(列)值等于“开”的参与者(用行表示)添加分数“ 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)

2 个答案:

答案 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)