giống như python pandas: how to find rows in one dataframe but not in another? này nhưng với nhiều cộtPandas: Tìm hàng mà không tồn tại trong DataFrame khác theo nhiều cột
Đây là thiết lập:
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']
))
Bây giờ, tôi muốn chọn các hàng từ df
không tồn tại ở các hàng khác. Tôi muốn làm sự lựa chọn bởi col1
và col2
Trong SQL tôi sẽ làm:
select * from df
where not exists (
select * from other o
where df.col1 = o.col1 and
df.col2 = o.col2
)
Và trong Pandas tôi có thể làm một cái gì đó như thế này nhưng nó cảm thấy rất xấu xí. Một phần của sự xấu xa có thể tránh được nếu df có id-cột nhưng nó không phải lúc nào cũng có sẵn.
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)
Vì vậy, có thể có một số cách thanh lịch hơn?
Cảm ơn bạn đã quay lại điều này. Bạn có thể làm điều này trong một dòng với 'df.merge (khác, how = 'left', indicator = True) .query ('_ merge ==" left_only "')' nhưng không biết nếu đó là tốt hơn. – Pekka
Cá nhân tôi tìm thấy quá nhiều chuỗi vì lợi ích của việc sản xuất một lớp lót có thể làm cho mã khó đọc hơn, có thể có một số cải thiện về tốc độ và bộ nhớ mặc dù – EdChum
@Pekka: + để quay lại gốc ban đầu trong một dòng: 'df .merge (other, how = 'left', indicator = True) .query ('_ merge == "left_only"'). thả (['_ merge'], axis = 1) ' – SpeedCoder5