加入DataFrame以更新原始值

时间:2018-07-17 15:39:32

标签: python pandas merge

prev_staff DataFrame包含电子邮件和一个true / false标志。我想用另一个DataFrame更新此标志,该DataFrame包含电子邮件的子列表和一个都设置为true的标志。 我正在寻找一种更新列值的更有效方法,而不必从结果合并中删除和重命名列。 原始列是可午餐的,但是合并会生成Lunchable_x和y,我想避免不得不对其进行管理。

new_staff = pd.merge(prev_staff,new_staff_emails, on='email',how='left')
new_staff['lunchable_x'] = new_staff['lunchable_y']
new_staff = new_staff.drop(columns=['lunchable_y'])
new_staff =  new_staff.rename(columns={'lunchable_x': 'lunchable'})
new_staff['lunchable'].fillna('false', inplace=True)
new_staff.to_csv(path + 'staff.csv')
  

new_staff列

Index(['user_id', 'name', 'email', 'start_date', 'table', 'team', 'specialty',
       'lunchable', 'previous_lunches'],
      dtype='object')
  

new_staff_emails列

Index(['email', 'lunchable'], dtype='object')
  

prev_staff列

Index(['user_id', 'name', 'email', 'start_date', 'table', 'team', 'specialty',
       'lunchable', 'previous_lunches'],
      dtype='object')

3 个答案:

答案 0 :(得分:3)

您可以使用以下命令直接在lunchable中设置new_staff的值:

new_staff.loc[new_staff["email"].isin(prev_staff["email"]), "lunchable"] = True

此代码将为new_staff["lunchable"] = True中的所有电子邮件以及new_staff中的所有电子邮件设置prev_staff

答案 1 :(得分:2)

根据您的解释,似乎不需要使用合并,因为对于新表中的所有记录,此标志都设置为true。使用np.where应该很好。 (但是,如果我误解了您的问题,请随时告诉我)

new_staff = prev_staff.copy()
new_staff['lunchable'] = np.where(new_staff['emials'].isin(list(new_staff_emails.email.unique())),'True',new_staff['lunchable'])

答案 2 :(得分:1)

您可以直接分配一系列布尔值:

new_staff['lunchable'] = new_staff['email'].isin(prev_staff['email'].unique())

您的新系列将由TrueFalse值组成,具体取决于prev_staff['email']中是否存在每个电子邮件地址。

直接分配将比merge更有效,因为它不涉及创建新的数据帧。