如果我有两个数据框,其中一个是另一个的子集,如何完全删除公共行?

时间:2019-05-16 07:52:41

标签: python pandas dataframe

我已经在寻找这种类型的问题,但没有一个能真正回答我的问题。

假设我有两个数据框,它们的索引不一致。 df2df1的子集,我想删除df1中存在的df2中的所有行。

我已经尝试了以下方法,但是并没有给我想要的结果。

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

很遗憾,我无法与您共享原始数据,但是,两个数据框中的列数为14。

以下是我要寻找的示例:

df1 = 

   month  year  sale
0      1  2012    55
1      4  2014    40
2      7  2013    84
3     10  2014    31
df2 = 
   month  year  sale
0      1  2012    55
1     10  2014    31

我正在寻找:

df = 

   month  year  sale
0      4  2014    40
1      7  2013    84

4 个答案:

答案 0 :(得分:1)

使用DataFrame.mergeindicator参数左联接,然后比较Series.eq==)的新列并按boolean indexing进行过滤:

df = df1[df1.merge(df2, indicator=True, how='left')['_merge'].eq('left_only')]
print (df)
   month  year  sale
1      4  2014    40
2      7  2013    84

答案 1 :(得分:1)

因此,您想要的是按值而不是按索引删除。

使用串联并删除:

CREATE INDEX IX_uid_date ON reviews (uid, date);

示例:

SELECT
     t.UserName
    ,t.BusinessName
    ,t.city
    ,t.text
    ,t.date
FROM
    friends
    INNER JOIN LATERAL
    (
        SELECT
            users.name AS UserName
            ,business.name AS BusinessName
            ,business.city
            ,reviews.text
            ,reviews.date
        FROM
            reviews
            INNER JOIN users ON users.uid = reviews.uid
            INNER JOIN business ON business.bid = reviews.bid
        WHERE
            reviews.uid = friends.fid
        ORDER BY reviews.date DESC
        LIMIT 1
    ) AS t ON true
WHERE
    friends.uid = '{userId}'
;

结果:

comp = pd.concat([df1, df2]).drop_duplicates(keep=False)

答案 2 :(得分:1)

您可以尝试以下操作吗:

df1[~df1.isin(df2)]

答案 3 :(得分:1)

您可以使用每个数据框中的所有列创建一个多索引。从那时起,您只需删除第一个索引中的第二个索引:

df1.set_index(list(df1.columns)).drop(df2.set_index(list(df2.columns)).index).reset_index()

示例数据的结果:

   month  year  sale
0      4  2014    40
1      7  2013    84