Mam dwie ramki danych

Df1 z jedną kolumną

{0:[1,2,3,4,5,6,7,11]}

Df2 z dwoma kol

{0:[100,4,6,7],1:[1,3,4,7]}

Muszę usunąć wiersze z df1 z wartością w dowolnej kolumnie w df2

Ressult dataframe

df3 = [2,5,11]
1
aryan singh 31 marzec 2020, 20:07

3 odpowiedzi

Najlepsza odpowiedź

Możesz użyć pandas.DataFrame.isin:

df1[~df1[0].isin(df2.values.flatten())]

Wynik:

enter image description here


Dla dużych ramek danych wykonałem następujący prosty test porównawczy:

enter image description here

import numpy as np

from simple_benchmark import BenchmarkBuilder
b = BenchmarkBuilder()

@b.add_function()
def anky_91(t):
    df1, df2 =  t
    df1[~df1[0].isin(df2.stack())]

@b.add_function()
def kederrac(t):  
    df1, df2 =  t
    df1[~df1[0].isin(df2.values.flatten())]

@b.add_function()   
def yatu(t):
    df1, df2 =  t
    df1[~df1.squeeze().isin(df2.stack())]


@b.add_arguments('NUmber of rows ind df')
def argument_provider():
    for exp in range(2, 18):
        size = 2**exp
        df1 = pd.DataFrame(np.random.randint(0, size // 10 or 10,size= (size , 1)))
        df2 = pd.DataFrame(np.random.randint(0, size // 10 or 10 ,size=(size , 2)))
        yield size, (df1, df2)

r = b.run()
r.plot()
1
kederrac 31 marzec 2020, 18:49

Ułóż drugą ramkę danych w stos i wykonaj isin w pierwszej kolumnie, a następnie odwróć

df1[~df1[0].isin(df2.stack())]

    0
1   2
4   5
7  11
2
anky 31 marzec 2020, 17:09

Oto jeden sposób korzystania z isin z stack:

df1[~df1.squeeze().isin(df2.stack())]

    0
1   2
4   5
7  11
3
yatu 31 marzec 2020, 17:10