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 Réponses :
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
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"]})
"" pour chaque ligne de DF1, si DF1.col1 se termine par une valeur de DF2.col1, supprimez la ligne. ""
# 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.
Cela pourrait-il devenir quelque chose comme: df [~ df1.col1.str.contains ("$ |" .join (df2.col1.str) + "$", regex = True, na = False)] code >? 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
"" 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.