【问题标题】:Resolve duplicates after Pandas mergePandas 合并后解决重复问题
【发布时间】:2021-09-12 13:30:56
【问题描述】:

我有两个 Pandas 数据框,分别命名为 table_A 和 table_B:

table_A

ID COST DATE MONTH
CLSLT88150 655.118 2019-12-30 1
CLSLT88150 652.758 2019-12-30 1

table_B

ID NUMBER ORDER DEVICE
CLSLT88150 4.45882e+07 WO-SLT-GLI-REC-0009-5067 Apple iPhone XR
CLSLT88150 4.45882e+07 WO-SLT-GLI-REC-0009-5786 Apple iPhone XR

我想合并ID 上的这两个表以获得类似于此表的结果:

table_merge

ID COST DATE MONTH ORDER NUMBER DEVICE
CLSLT88150 655.118 2019-12-30 1 WO-SLT-GLI-REC-0009-5067 4.45882e+07 Apple iPhone XR
CLSLT88150 652.758 2019-12-30 1 WO-SLT-GLI-REC-0009-5786 4.45882e+07 Apple iPhone XR

每个ID可以有多个ORDER。每个 ORDER 只能出现一次,并关联一个唯一的 COST。哪个 COST 与哪个 ORDER 相关联无关紧要,因此该表也可能是可接受的结果:

ID COST DATE MONTH ORDER NUMBER DEVICE
CLSLT88150 652.758 2019-12-30 1 WO-SLT-GLI-REC-0009-5067 4.45882e+07 Apple iPhone XR
CLSLT88150 655.118 2019-12-30 1 WO-SLT-GLI-REC-0009-5786 4.45882e+07 Apple iPhone XR

我已使用以下脚本将 合并 table_Atable_B

table_merge = table_A.merge(table_B)

得到这个不想要的结果:

ID COST DATE MONTH ORDER NUMBER DEVICE
CLSLT88150 655.118 2019-12-30 1 WO-SLT-GLI-REC-0009-5067 4.45882e+07 Apple iPhone XR
CLSLT88150 655.118 2019-12-30 1 WO-SLT-GLI-REC-0009-5786 4.45882e+07 Apple iPhone XR
CLSLT88150 652.758 2019-12-30 1 WO-SLT-GLI-REC-0009-5067 4.45882e+07 Apple iPhone XR
CLSLT88150 652.758 2019-12-30 1 WO-SLT-GLI-REC-0009-5786 4.45882e+07 Apple iPhone XR

我尝试使用此脚本删除不需要的行,但失败了:

table_merge = table_merge.drop_duplicates(subset=['ORDER','ID'])

删除重复后 table_merge 看起来像这样:

ID COST DATE MONTH ORDER NUMBER DEVICE
CLSLT88150 655.118 2019-12-30 1 WO-SLT-GLI-REC-0009-5067 4.45882e+07 Apple iPhone XR
CLSLT88150 655.118 2019-12-30 1 WO-SLT-GLI-REC-0009-5786 4.45882e+07 Apple iPhone XR

可以看出,COST 655.118 重复了,而另一个 COST 的 652.758 缺失。

我怎样才能得到想要的结果?

谢谢。

【问题讨论】:

  • 选择不同成本的业务规则是什么?
  • @Umar.H 成本选择没有特别的规则。我认为它对这项任务无动于衷。唯一的规则是 ORDER 必须是唯一的,并且与唯一的 COST 相关联。
  • @Umar.H 不,此脚本不起作用,因为 ORDER 重复。
  • @GGS 删除重复项后,一个订单以 5067 结束,而另一个以 5786 结束。这不是预期的行为吗?
  • @GGS 对我来说似乎是一个很好的解决方案 :)

标签: python pandas merge duplicates


【解决方案1】:

所有不需要的重复都以 4 行为一组出现。只需选择第一行和最后一行,就可以解决重复问题。代码如下所示:

def resolve_duplicates(df):
    indexes = df.index
    return df[(df.index == indexes[0]) | (df.index == indexes[-1])]

用作输入:

ID COST DATE MONTH ORDER NUMBER DEVICE
CLSLT88150 655.118 2019-12-30 1 WO-SLT-GLI-REC-0009-5067 4.45882e+07 Apple iPhone XR
CLSLT88150 655.118 2019-12-30 1 WO-SLT-GLI-REC-0009-5786 4.45882e+07 Apple iPhone XR
CLSLT88150 652.758 2019-12-30 1 WO-SLT-GLI-REC-0009-5067 4.45882e+07 Apple iPhone XR
CLSLT88150 652.758 2019-12-30 1 WO-SLT-GLI-REC-0009-5786 4.45882e+07 Apple iPhone XR

函数的输出是:

ID COST DATE MONTH ORDER NUMBER DEVICE
CLSLT88150 655.118 2019-12-30 1 WO-SLT-GLI-REC-0009-5067 4.45882e+07 Apple iPhone XR
CLSLT88150 652.758 2019-12-30 1 WO-SLT-GLI-REC-0009-5786 4.45882e+07 Apple iPhone XR

【讨论】:

    猜你喜欢
    • 2020-02-23
    • 1970-01-01
    • 2018-08-01
    • 2014-10-02
    • 1970-01-01
    • 2019-04-19
    • 2011-07-22
    • 2010-10-11
    • 1970-01-01
    相关资源
    最近更新 更多