0
votes

Existe-t-il un moyen de comparer les valeurs d'un DataFrame Pandas avec les valeurs d'un second DataFrame?

J'ai 2 Dataframes Pandas avec 5 colonnes et environ 1000 lignes chacune (travaillant avec python3).
Je suis intéressé à faire une comparaison entre la première colonne de df1 et la première colonne de df2 comme suit:

def check_presence(df1_col1, second_csv):
    for index, row in second_csv.iterrows():
        search_string = "(?P<first_group>^(" + some_string + "))(?P<the_rest>" + row["col1"] + "$)"
        if re.search(search_string, df1_col1):
            return True
    return False
DF1
[index]   [col1]
2         "acksyn"
3         "foobaz"
...       ...


3 commentaires

"" pour chaque ligne de DF1, si DF1.col1 se termine par une valeur de DF2.col1, supprimez la ligne. "" Connaissez-vous le nombre de valeurs que DF1.col1 correspond à DF2.col1? Est-ce juste les 3 dernières valeurs de DF1.col1 que vous correspondez à DF2.col1?


Non, je ne connais pas le nombre exact de chacun. La correspondance doit être avec les valeurs DF2.col1 entières, pas les trois dernières. C'était un exemple


Pas de problème - j'ai ajouté un one-liner qui devrait répondre à vos besoins.


3 Réponses :


1
votes

Vous devrez d'abord joindre vos mots clés dans df2 si vous souhaitez utiliser la méthode str.contains .

import pandas as pd

df = pd.DataFrame({'col1': {0: 'foobar', 1: 'acksyn', 2: 'foobaz', 3: 'ackfin'}})
df2 = pd.DataFrame({'col1': {0: 'old', 1: 'fin', 2: 'new', 3: 'bar'}})

print (df["col1"].str.contains("|".join(df2["col1"])))

#
0     True
1    False
2    False
3     True


0 commentaires

0
votes

Prenez vos montures

 frame1["col2"]=frame1["col1"].str.contains(pattern)
frame1.loc[frame1["col2"]==True]
     col1  col2
0  foobar  True
3  ackfin  True

Puis

myList=frame2.col2.values
pattern='|'.join(myList)

Enfin

frame1 =frame1=pd.DataFrame({"col1":["foobar","acksyn","foobaz","ackfin"]})
frame2=pd.DataFrame({"col1":["old","fin","new","bar"]})


0 commentaires

0
votes

Solution possible

"" pour chaque ligne de DF1, si DF1.col1 se termine par une valeur de DF2.col1, supprimez la ligne. ""

Ceci est une ligne unique si je comprends bien:

# Search for Substring
# Generate an "OR" statement with a join
# Drop if match. 
df[~df.col1.str.contains('|'.join(df2.col1.values))]

Cela ne conservera que les lignes où DF2.Col1 est PAS strong> trouvé dans DF1.Col1.

pd .Series.str.contains


2 commentaires

Cela pourrait-il devenir quelque chose comme: df [~ df1.col1.str.contains ("$ |" .join (df2.col1.str) + "$", regex = True, na = False)] ? Les chaînes DF1 doivent se terminer par l'un des DF2 pour être supprimées


Vous pourriez s'il y a une valeur de filtrage supplémentaire en le faisant