如果其他列中的字符串包含列表中的内容,则更新一列中的值

问题描述 投票:1回答:3
  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

我有很多人的名字和性别在df中,取自电影演员的数据库。性别被分配1(女性),2(男性)或0(未列出)。我想通过名字梳理并无情地假设性别。名称将存储在列表中,并手动填写。也许我发现一个ID不具有性别非特定名称的人,如果他们是男性/女性,我会发现自己,我也想注入它:

m_names = ['John', ...]
f_names = ['Jennifer', ...]
m_ids   = ['37', ...]
f_ids   = ['', ...]

我已经很好地控制了for循环和np.where,但我无法弄清楚如何逐行完成这个df。

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

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

注意'|'之前的空格在名称的条件,以避免抓住姓氏的任何部分。

在这一点上,我遇到了如何格式化if语句的问题。 Python不喜欢我的格式,并说我的'返回'是'外部功能'。如果我改变这些

row['gender'] = #

我遇到了unicode和我对'str'和'contains'的使用问题。

python pandas replace iteration conditional
3个回答
2
投票

好像你需要np.select而不需要循环

df['gender'] = np.select([df.name.str.contains(" |".join(m_names)),
                          df.name.str.contains(" |".join(f_names))],
                         [2, 1], 
                         default=3)

0
投票

你可以使用Pandas函数isin

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.isin.html

df.loc[df.name.isin(m_names), 'gender'] = 2

0
投票

您可以先构造并组合布尔蒙版。例如:

m_zero = df['gender'].eq(0)

m_name_female = df['name'].str.contains(' |'.join(f_names))
m_name_male = df['name'].str.contains(' |'.join(m_names))

m_id_female = df['id'].str.contains('|'.join(f_ids))
m_id_male = df['id'].str.contains('|'.join(m_ids))

female_mask = m_zero & (m_name_female | m_id_female)
male_mask = m_zero & (m_name_male | m_id_male)

然后通过pd.DataFrame.loc应用逻辑:

df.loc[female_mask, 'gender'] = 1
df.loc[male_mask, 'gender'] = 2

或者使用嵌套的numpy.where

df['gender'] = np.where(female_mask, 1, np.where(male_mask, 2, df['gender']))

或者,如果您希望提供标量默认值,请使用numpy.select

df['gender'] = np.select([female_mask, male_mask], [1, 2], 3)
© www.soinside.com 2019 - 2024. All rights reserved.