我有一个数据框(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'的条件。有人知道可能导致这个问题的原因吗?
答案 0 :(得分:0)
我建议使用带有str.contains
的非循环矢量化解决方案,并将布尔掩码转换为integer
- True
为1
,False
为0
:
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