【问题标题】:Drop rows pandas based on combination of matched column values with other dataframe根据匹配列值与其他数据框的组合删除行熊猫
【发布时间】:2019-02-08 17:58:15
【问题描述】:

设置

我有 2 个 pandas dfs(df1 和 df2),其中包含一些重叠行和一些非重叠行。

两个 dfs 都有 order_idshop 列。

现在,如果 df1 中的行与 df2 中的任意行匹配 order_idshop 的组合,则应从 df1 中删除该行。如果此行与order_idshop 上的df2 中的任何行都不匹配,则应保留它。


示例

df2 是这样的,

    order_id    shop
0     12345     'NL'
1     45678     'FR'
2     12345     'DE'
3     34567     'NL'

现在如果df1 这样,

    order_id    shop
0     12345     'NL'
1     45678     'FR'

那么 df1 应该返回空。


但是如果df1这样的话,

        order_id    shop
0       12345       'NL'
1       99999       'FR'
2       12345       'UK'

那么df1 应该返回,

        order_id    shop
0       99999       'FR'
1       12345       'UK'

代码

我创造了一条怪异的线,然后并没有真正起作用......

到目前为止,我有,

result_df = df1[(~df1['order_id'].astype(str).isin(df2['order_id'].astype(str)))]

我该如何解决这个问题?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    我认为列的类型不一样,所以先将其转换为string,然后将其转换为mergeindicator=True

    df3 = (df1.astype(str).merge(df2.astype(str), how='left', indicator=True)
              .query('_merge == "left_only"')[df1.columns])
    print (df3)
       order_id  shop
    2     99999  'FR'
    3     12345  'UK'
    

    也可以在解决方案之前检查是否相同的数据类型:

    print (df1.dtypes)
    print (df2.dtypes))
    

    并且只转换不同的列dtype:

    df2['order_id'] = df2['order_id'].astype(str)
    

    【讨论】:

    • 我试过这个,但它返回的行已经在df1
    • @LucSpan - 不确定,有什么问题,对我来说效果很好。没有将df1df2 交换,所以需要df3 = (df2.astype(str).merge(df1.astype(str), how='left', indicator=True) .query('_merge == "left_only"')[df1.columns])
    • 是的,我知道。我在这个例子上试过你的,效果很好。也许它与实际dfs中的数据有关。
    • @LucSpan - 嗯,似乎一些与数据相关的问题,如尾随空格或匹配浮点数或类似问题。然后最好将值导出到df3.to_dict('list') 列出并检查是否存在一些差异。
    猜你喜欢
    • 1970-01-01
    • 2016-10-31
    • 2016-05-07
    • 1970-01-01
    • 2023-03-17
    • 2023-01-11
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    相关资源
    最近更新 更多