我已经在寻找这种类型的问题,但没有一个能真正回答我的问题。
假设我有两个数据框,它们的索引不一致。 df2
是df1
的子集,我想删除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
答案 0 :(得分:1)
使用DataFrame.merge
和indicator
参数左联接,然后比较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