【问题标题】:Merging two pandas data frames with duplicate ON entries合并两个带有重复 ON 条目的 pandas 数据帧
【发布时间】:2021-06-12 00:28:23
【问题描述】:

我正在使用两个 pandas DataFrame(两个单独的年份),其中包含有关个人的信息。我正在使用 pd.merge 和内部连接。我可以根据个人姓名设置“开”。但是,我注意到有同名的重复条目(基本上是两个同名的人)。为了分隔这些记录,我使用了其他字段,例如它们的位置。我的代码如下:

df_combine = pd.merge(df_current, df_old, on=['Name', 'Department', 'College Name'])

虽然这可以解决此特定情况,但在某些情况下,具有唯一名称的人会调动部门。因此,这不会被捕获。

有没有办法先按名称合并唯一案例,然后按名称重复记录以考虑其他字段?

为清楚起见,考虑在两个不同部门中有两个“Doe,John”的记录,在一个部门中有一个“Doe,Jane”在一年内,另一个在第二年。我希望代码能够识别两个“Doe,John”和一个“Doe,Jane”

编辑,示例数​​据框:

最新数据框:

Name, Department, Field1
"Doe,John","ABC",555
"Doe,John","DEF",145
"Doe,Jane","FGH",205

上一个数据框:

Name, Department, Field1
"Doe,John","ABC",345
"Doe,John","DEF",140
"Doe,Jane","ABC",200

注意 Jane Doe 部门的变化。

预期结果:

Name, Department, Field1_A, Field1_B
"Doe,John","ABC",555,345
"Doe,John","DEF",145,140
"Doe,Jane","FGH",205,200

【问题讨论】:

  • 如果您可以提供可复制的输入数据框和输出数据框以进行检查,这将很有帮助
  • 我编辑了 OP 来举个例子。我正在合并此表中的其他列。

标签: python python-3.x pandas dataframe


【解决方案1】:

您可以将pd.mergehow 参数设置为'left' 一起使用,重要的是第一个数据帧是最新的,以便保存最新的数据。另请注意,我没有使用 Field1 作为 on 参数中的键,因为我想保留两个数据帧中的两列。

#Sample data
df_lastest = pd.DataFrame(columns=['Name', 'Department', 'Field1'], data=[["Doe,John","ABC",555], ["Doe,John","DEF",145], ["Doe,Jane","FGH",205]])  
df_previous = pd.DataFrame(columns=['Name', 'Department', 'Field1'], data=[["Doe,John","ABC",345], ["Doe,John","DEF",140], ["Doe,Jane","ABC",200]])

df_merge = pd.merge(df_lastest, df_previous, how='left', on=['Name', 'Department'], suffixes=('_A', '_B'))
df_merge['Field1_B'].fillna(df_previous['Field1'], inplace=True)

print(df_merge)

输出:

     Name   Department  Field1_A    Field1_B
0   Doe,John    ABC     555           345
1   Doe,John    DEF     145           140
2   Doe,Jane    FGH     205           200

Screenshot using Google Colab

【讨论】:

  • 随着部门的变化,从 ABC 到 FGH,这并不完全适用于 Jane Doe 案例。请参阅上面的帖子。
  • @astrochun 请再次测试,我已经更新了答案。
  • 不,它不适用于 Jane Doe。部门再次发生变化。您上面的代码假定它是相同的。
  • 谢谢,我可以再试一次,但我想知道我的示例是否没有直接解决我的问题。
  • @astrochun 我明白了,只要记住你也可以在 SO 中发布另一个问题,祝你的任务好运!
猜你喜欢
  • 2021-11-20
  • 1970-01-01
  • 2020-03-28
  • 2012-07-23
  • 2019-01-21
  • 1970-01-01
  • 2022-11-25
  • 2017-01-06
  • 2021-12-18
相关资源
最近更新 更多