2015-10-26 3 views
1

У меня есть 2 dataFrames и вы хотите их сравнить и вернуть строки из первого (df1), которые не находятся во втором (df2). Я нашел способ сравнить их и вернуть различия, но не могу понять, как вернуть только отсутствующие из df1.Сравнить PandaS DataFrames и вернуть строки, отсутствующие в первом

import pandas as pd 
from pandas import Series, DataFrame 

df1 = pd.DataFrame({ 
"City" : ["Chicago", "San Franciso", "Boston"] , 
"State" : ["Illinois", "California", "Massachusett"] }) 

df2 = pd.DataFrame({ 
"City" : ["Chicago", "Mmmmiami", "Dallas" , "Omaha"] , 
"State" : ["Illinois", "Florida", "Texas", "Nebraska"] }) 



df = pd.concat([df1, df2]) 
df = df.reset_index(drop=True) 

df_gpby = df.groupby(list(df.columns)) 
idx = [x[0] for x in df_gpby.groups.values() if len(x) == 1] 
blah = df.reindex(idx) 
+0

Вы могли бы быть немного более конкретными. В чем вопрос? Где проблема? ... – lrleon

ответ

3

IIUC тогда, если вы используете версию панд 0.17.0, то вы можете использовать merge и установить indicator=True:

In [80]: 
df1 = pd.DataFrame({ 
"City" : ["Chicago", "San Franciso", "Boston"] , 
"State" : ["Illinois", "California", "Massachusett"] }) 
​ 
df2 = pd.DataFrame({ 
"City" : ["Chicago", "Mmmmiami", "Dallas" , "Omaha"] , 
"State" : ["Illinois", "Florida", "Texas", "Nebraska"] }) 
pd.merge(df1,df2, how='outer', indicator=True) 

Out[80]: 
      City   State  _merge 
0  Chicago  Illinois  both 
1 San Franciso California left_only 
2  Boston Massachusett left_only 
3  Mmmmiami  Florida right_only 
4  Dallas   Texas right_only 
5   Omaha  Nebraska right_only 

Это добавляет столбец индикатора, присутствуют ли только в или LHS или RHS строки

0

Если вы на панд < 0.17.0

вы могли бы работать свой путь вверх, как

In [182]: df = pd.merge(df1, df2, on='City', how='outer') 

In [183]: df 
Out[183]: 
      City  State_x State_y 
0  Chicago  Illinois Illinois 
1 San Franciso California  NaN 
2  Boston Massachusett  NaN 
3  Mmmmiami   NaN Florida 
4  Dallas   NaN  Texas 
5   Omaha   NaN Nebraska 

In [184]: df.ix[df['State_y'].isnull(),:] 
Out[184]: 
      City  State_x State_y 
1 San Franciso California  NaN 
2  Boston Massachusett  NaN 
4

Опираясь на @ EdChum-х предложение:

df = pd.merge(df1, df2, how='outer', indicator=True) 
rows_in_df1_not_in_df2 = df[df['_merge']=='left_only'][df1.columns] 

rows_in_df1_not_in_df2 

|Index |City  |State  | 
|------|------------|------------| 
|1  |San Franciso|California | 
|2  |Boston  |Massachusett| 
Смежные вопросы