gleiche wie dieser python pandas: how to find rows in one dataframe but not in another? aber mit mehreren SpaltenPandas: Findet Datensätze, die in einem anderen Datenrahmen nicht existieren nach mehreren Spalten
Dies ist die Setup:
import pandas as pd
df = pd.DataFrame(dict(
col1=[0,1,1,2],
col2=['a','b','c','b'],
extra_col=['this','is','just','something']
))
other = pd.DataFrame(dict(
col1=[1,2],
col2=['b','c']
))
Nun, ich möchte, dass die Auswahl Zeilen von df
die nicht in anderen existieren. Ich möchte die Auswahl von col1
und col2
In SQL zu tun, würde ich tun:
select * from df
where not exists (
select * from other o
where df.col1 = o.col1 and
df.col2 = o.col2
)
Und in Pandas Ich kann so etwas tun, aber es fühlt sich sehr hässlich. Ein Teil der Hässlichkeit könnte vermieden werden, wenn df ID-Spalte hätte, aber es ist nicht immer verfügbar.
key_col = ['col1','col2']
df_with_idx = df.reset_index()
common = pd.merge(df_with_idx,other,on=key_col)['index']
mask = df_with_idx['index'].isin(common)
desired_result = df_with_idx[~mask].drop('index',axis=1)
Also vielleicht gibt es einige eleganteren Weg?
Vielen Dank für das Zurückkommen. Sie könnten dies in einer Zeile mit 'df.merge (andere, wie = 'links', Indikator = True) .query ('_ merge ==" left_only "') tun, aber ich weiß nicht, ob das besser ist. – Pekka
Persönlich finde ich zu viel Verkettung für die Herstellung eines ein Liner kann den Code schwieriger zu lesen, kann es einige Geschwindigkeit und Speicher Verbesserungen sein, obwohl – EdChum
@Pekka: +, um in einer Zeile zurück zu ursprünglichen links: 'df .merge (andere, wie = 'links', Indikator = True) .query ('_ merge == "left_only"'). drop (['_ merge'], axis = 1) ' – SpeedCoder5