在df.iterrows中的df.loc更改条件中指定的行之外的行

时间:2018-04-22 07:05:39

标签: python pandas dataframe

我有一个数据框(df1),其中一列(Detail)在每一行中都包含一个字符串。我使用df1.Detail.str.split()将列的每个字符串拆分成一个列表。

我有另一个列(Pass)默认设置为0。如果df1 [Detail]中的列表包含单词'pass',我试图将df1 [Pass]的值更改为1。我试图使用iterrows()逐行进行此操作。

当我运行以下代码时,它会正确显示符合我的条件和相应索引的行:

for index,row in df1.iterrows():
    if 'pass' in i.Detail:
        print i.Detail, index

但是,当我尝试使用以下代码更新'Pass'中的行值时:

for index,row in df1.iterrows():
    if 'pass' in i.Detail:
        df1.loc[index,'Pass'] = 1

最终将'Pass'中98%的行值更新为1,即使该行不符合在'Detail'中包含单词'pass'的条件。有人知道可能导致这个问题的原因吗?

1 个答案:

答案 0 :(得分:0)

我建议使用带有str.contains的非循环矢量化解决方案,并将布尔掩码转换为integer - True1False0

df.Pass = df.Detail.str.contains('pass').astype(int)

<强>示例

df = pd.DataFrame({'Detail':['pass exam','not passed','aaa'],
                   'Pass':[1]*3})

#match substrings
df.Pass = df.Detail.str.contains('pass').astype(int)
#match whole word only
#https://stackoverflow.com/a/37457930/2901002
df['Pass1'] = df.Detail.str.contains(r'(?:\s|^)pass(?:\s|$)').astype(int)

print (df)
       Detail  Pass  Pass1
0   pass exam     1      1
1  not passed     1      0
2         aaa     0      0