簡體   English   中英

如果另一列中的字符串包含列表中的內容,則更新一列中的值

[英]Update Value in one column, if string in other column contains something in list

  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

我有很多人的名字和性別,取自電影演員數據庫。 為性別分配了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”用法的問題。

似乎您需要np.select並且沒有for循環

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

您可以使用熊貓功能isin

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

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

您可以首先構造和組合布爾掩碼。 例如:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM