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')
答案 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())
您的新系列将由True
或False
值组成,具体取决于prev_staff['email']
中是否存在每个电子邮件地址。
直接分配将比merge
更有效,因为它不涉及创建新的数据帧。