【问题标题】:Joining DataFrames to update a value in original加入 DataFrames 以更新原始值
【发布时间】:2018-07-17 15:39:32
【问题描述】:

prev_staff DataFrame 包含电子邮件和真/假标志。我想用另一个 DataFrame 更新这个标志,其中包含一个电子邮件子列表和一个全部设置为 true 的标志。 我正在寻找一种更有效的方法来更新列值,而不必从结果合并中删除和重命名列。 原始列是可午餐的,但合并生成了一个可午餐的_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')

【问题讨论】:

  • 能否包含 prev_staff 和 new_staff_emails 的标题?
  • 如果电子邮件在new_staff 中,您可以将prev_staff 中的lunchable 的值设置为True,而不是在这里合并?
  • 除了合并之外,您建议如何执行此操作?
  • 我不清楚你在问什么。你能提供一个minimal reproducible example吗?
  • 那么如果用 new_staff 的内容更新以前员工的电子邮件并保留除合并生成的副本之外的所有列,您想要什么,对吗?

标签: python pandas merge


【解决方案1】:

您可以直接在new_staff 中设置lunchable 的值,而不是加入:

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

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

【讨论】:

  • 这很好。使用 isin 与合并对性能有何影响?您会在数百万行中使用相同的方法吗?
  • 在我看来,如果你以后直接去fillna(False),你还不如直接赋值布尔序列。
【解决方案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'])

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-26
      • 2021-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-31
      • 1970-01-01
      相关资源
      最近更新 更多