【问题标题】:Fill multiple columns with value from another dataframe用来自另一个数据框的值填充多列
【发布时间】:2021-05-14 19:48:06
【问题描述】:

我正在尝试根据某些条件用另一个 Pandas 数据帧中的列填充一个 Pandas 数据帧中的空列。

第一个表是audit_records_df,它看起来像这样:

id audit_type audit_date maliciousness_level suspicious_counts
123456 Unknown 2/5/21 NaN NaN
123456 Cleared 2/6/21 NaN NaN
123456 Terminated 2/8/21 NaN NaN
345678 Terminated 2/5/21 NaN NaN

第二张表是spam_profile_most_recent_notes:

id audit_type audit_date maliciousness_level suspicious_counts ire_1 ire_2
123456 Unknown 2/5/21 high 3 222 222
345678 Terminated 2/5/21 high 6 222 222

请注意,与 audit_records_df 表格不同(其中一个 id 可能有多行),在 spam_profile_most_recent_notes 每个表格 id 只有 1 行。

我正在尝试使用来自spam_profile_most_recent_notes 表的同名列的值填充audit_records_df 表中的列maliciousness_levelsuspicious_counts(我们需要忽略列ire_1ire_2),基于符合以下标准:

  • 对于audit_records_df 表中idspam_profile_most_recent_notes 中的id 匹配的行,将audit_records_df 表中的maliciousness_levelsuspicious_counts 填入audit_records_df 表中spam_profile_most_recent_notes 表中@ 987654346@ 匹配。

填充后,audit_records_df 表应如下所示:

id audit_type audit_date maliciousness_level suspicious_counts
123456 Unknown 2/5/21 high 3
123456 Cleared 2/6/21 high 3
123456 Terminated 2/8/21 high 3
345678 Terminated 2/5/21 high 6

我见过一些与此类似的问题:Conditionally fill column with value from another DataFrame based on row match in Pandas。但是,我所看到的只是在 1 列中填写值,这与我必须为多列填写值的用例不同。

任何建议将不胜感激。

【问题讨论】:

标签: python pandas


【解决方案1】:

我认为您可以通过以下方式解决此问题:

  1. audit_record_df 表中删除malicious_levelsuspicious_counts 列。
  2. 仅保留spam_profile_most_recent_notes 中的idmalicious_levelsuspicious_counts
  3. 使用id 在两个表上执行左内连接
audit_record_df.drop(['maliciousness_level', 'suspicious_counts'], axis=1, inplace=True)
print(audit_record_df)

       id  audit_type audit_date
0  123456     Unknown     2/5/21
1  123456     Cleared     2/6/21
2  123456  Terminated     2/8/21
3  345678  Terminated     2/5/21

spam_profile_most_recent_notes = spam_profile_most_recent_notes[['id', 'maliciousness_level', 'suspicious_counts']]
print(spam_profile_most_recent_notes)

       id  audit_type audit_date
0  123456     Unknown     2/5/21
1  123456     Cleared     2/6/21
2  123456  Terminated     2/8/21
3  345678  Terminated     2/5/21

new_df = audit_record_df.merge(spam_profile_most_recent_notes, on='id', how='left')
print(new_df)

       id  audit_type audit_date maliciousness_level  suspicious_counts
0  123456     Unknown     2/5/21                high                  3
1  123456     Cleared     2/6/21                high                  3
2  123456  Terminated     2/8/21                high                  3
3  345678  Terminated     2/5/21                high                  6   

【讨论】:

  • 谢谢@Safuan。这是我应该考虑的一种聪明方法,本质上是调整列以进行合并。
猜你喜欢
  • 2021-06-26
  • 1970-01-01
  • 2018-04-20
  • 1970-01-01
  • 2017-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多