【问题标题】:Remove any duplicate value in a specific row by comparing specific column in two dataframes [duplicate]通过比较两个数据框中的特定列来删除特定行中的任何重复值[重复]
【发布时间】:2019-05-22 18:41:46
【问题描述】:

我有两个 Pandas 数据框 (Python3)。如下所示。

df1
name, score
Tom, 130
Jane, 98
Anny, 81
Chuck, 92

df2
name
Amy
Chuck
Dave
Danny
Emma
Jack
Tom
Taro

我想要做的是查看 df1,如果在 df2 中找到任何名称,则从 df1 中删除名称、得分行。

我搜索了执行此操作的最佳方法,但没有一个对我有用。 (或者,可能我没有以正确的方式使用该函数。)例如,

output= (df1!=df2)

返回,

ValueError: Can only compare identically-labeled DataFrame objects

所以,它没有考虑分数列。

我期望得到的,

name, score
Jane, 98
Anny, 81

简和安妮不在 df2 中。

我该怎么做?

【问题讨论】:

  • df1[~df1.name.isin(df2.name)]
  • 谢谢,安迪。但是,我得到一个错误,'AttributeError: 'DataFrame' object has no attribute 'name'
  • @Andy 打败了我。如果你得到一个 AttributeError,你的列名不是你在问题中描述的。
  • @K.K.:我转而回答以提供修复。检查我的答案

标签: python-3.x pandas data-science


【解决方案1】:

首先重现您的示例

import pandas as pd
from pandas import Series, DataFrame

df1 = pd.DataFrame({'name' : ['Tom', 'Jane', 'Anny', 'Chuck'], 'score' : [130, 98, 81, 92]})
df2 = pd.DataFrame({'name' : ['Amy', 'Chuck', 'Dave', 'Danny', 'Emma', 'Jack', 'Tom', 'Taro']})

您可以根据df1[condition] 的条件从df1 中选择某些行。在您的情况下,您希望df1.name 不在df2.name 中。使用.name,您可以访问可以强制设置操作的底层数组。您可以通过df1.name.isin(df2.name) 获得df2 中的名称。要反转此表达式,您需要使用二进制反转 ~(因为它是布尔索引)。

In [23]: df1[~df1.name.isin(df2.name)]
Out[23]: 
   name  score
1  Jane     98
2  Anny     81

【讨论】:

    【解决方案2】:

    由于您有错误:'AttributeError: 'DataFrame' object has no attribute 'name',您的列名要么有空格,要么完全不同。
    做这个简单的修复:

    df1.columns = ['name', 'score']
    df2.columns = ['name']
    

    在那之后。它会工作

    df1[~df1.name.isin(df2.name)]
    

    注意:我假设您的 df1 有 2 列,而 df2 有 1 列,正如您所描述的那样。

    【讨论】:

      猜你喜欢
      • 2019-10-31
      • 1970-01-01
      • 2018-07-25
      • 2020-07-08
      • 2012-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多