Python 若另一列中的字符串包含列表中的内容,则更新一列中的值

Python 若另一列中的字符串包含列表中的内容,则更新一列中的值,python,pandas,replace,iteration,conditional,Python,Pandas,Replace,Iteration,Conditional,我在df中有很多人的名字和性别,取自电影演员的db。性别分配1(女性)、2(男性)或0(未列出)。我想梳理一下,冷酷地假设性别的名字。姓名将存储在列表中,并手动填写。也许我通过ID发现了一个性别非特定姓名的人,并发现了自己是否是男性/女性,我也想注射: id name gender 0 13 John Smith 0 1 46 Jim Jeffries 2 2 75 Jennifer Johnson 0 3 37 Sam Adams

我在df中有很多人的名字和性别,取自电影演员的db。性别分配1(女性)、2(男性)或0(未列出)。我想梳理一下,冷酷地假设性别的名字。姓名将存储在列表中,并手动填写。也许我通过ID发现了一个性别非特定姓名的人,并发现了自己是否是男性/女性,我也想注射:

  id name             gender
0 13 John Smith       0
1 46 Jim Jeffries     2
2 75 Jennifer Johnson 0
3 37 Sam Adams        0
4 24 John Cleese      0
5 17 Taika Waititi    0
我对for循环和np.where有很好的控制,但我不知道如何一行一行地通过这个df

如果使用上述内容,我想返回的内容如下:

m_names = ['John', ...]
f_names = ['Jennifer', ...]
m_ids   = ['37', ...]
f_ids   = ['', ...]
注意姓名条件中“|”之前的空格,以避免抓住姓氏的任何部分

在这一点上,我遇到了如何格式化if语句的问题。Python不喜欢我的格式,说我的“return”是“外部函数”。如果我把这些换成

for index, row in df.iterrows():
  if row['gender'] == 0:
    if   row['name'].str.contains(' |'.join(f_names)) or row['id'].str.contains('|'.join(f_ids)):
      return 1
    elif row['name'].str.contains(' |'.join(m_names)) or row['id'].str.contains('|'.join(m_ids)):
      return 2
print(df)

  id name             gender
0 13 John Smith       2
1 46 Jim Jeffries     2
2 75 Jennifer Johnson 1
3 37 Sam Adams        2
4 24 John Cleese      2
5 17 Taika Waititi    0
我遇到了unicode和“str”和“contains”用法的问题。

似乎您需要并且没有for循环

row['gender'] = #
似乎你需要而且不需要循环

row['gender'] = #

您可以使用Pandas函数isin


您可以使用Pandas函数isin


您可以首先构造和组合布尔掩码。例如:

df.loc[df.name.isin(m_names), 'gender'] = 2
然后通过以下方式应用逻辑:

或使用嵌套:

或者,如果希望提供标量默认值,请使用:


您可以首先构造和组合布尔掩码。例如:

df.loc[df.name.isin(m_names), 'gender'] = 2
然后通过以下方式应用逻辑:

或使用嵌套:

或者,如果希望提供标量默认值,请使用:


编辑:我误读了我的读数,看了看“之前”的df。它在没有任何其他条件语句的情况下工作!非常感谢。我明白我错过了什么。编辑:我误读了我的读数,看了看“before”df。它在没有任何其他条件语句的情况下工作!非常感谢。我知道我错过了什么。
df.loc[female_mask, 'gender'] = 1
df.loc[male_mask, 'gender'] = 2
df['gender'] = np.where(female_mask, 1, np.where(male_mask, 2, df['gender']))
df['gender'] = np.select([female_mask, male_mask], [1, 2], 3)