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 中有很多人的名字和性别,取自电影 Actor 的数据库。性别被指定为 1(女性)、2(男性)或 0(未列出)。我想梳理一下,并无情地按名字假设性别。姓名将存储在列表中,并手动填写。也许我通过 ID 发现某人的名字与性别无关,然后自己查明他们是男性/女性,我也想将其注入(inject):
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”的使用问题。
最佳答案
您可以使用 Pandas 函数 isin
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.isin.html
df.loc[df.name.isin(m_names), 'gender'] = 2
关于python - 如果其他列中的字符串包含列表中的内容,则更新一列中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52315644/