2017-02-20 11 views
2

У меня есть некоторые проблемы для сравнения двух dataframes в том, как я хотел бы:сравнить пересечение некоторых столбцов dataframes размера другого

df1=pd.DataFrame({"code1": ['A', 'B', 'C', 'C','D'], 
       "code2": ["1", "0", "1", "1","1"], 
       "column1":['value1','value2','value3','value4','value5']}) 

    code1 code2 column1 
    0  A  1 value1 
    1  B  0 value2 
    2  C  1 value3 
    3  C  1 value4 
    4  D  1 value5 

df2 = pd.DataFrame({"code1": ['A','B','C'], 
       "code2": ["0", "0", "1"], 
       "column2":['valuex','valuey','valuez']}) 

    code1 code2 column2 
    0  A  0 valuex 
    1  B  0 valuey 
    2  C  1 valuez 

Таковы два dataframe Я хотел бы сравнить. Мне нужно сделать что-то вроде

df1[['code1','code2']].isin(df2[['code1','code2']]) 

с целью получения результата:

 code1 code2 column1 
    0  B  0 value2 
    1  C  1 value3 
    2  C  1 value4 

Я хочу сохранить строки, имеющие ту же «code1» и «Кодекса2» в обоих df1 и df2, и другие столбцы df1. Знаете ли вы, как это сделать? Я хотел бы избежать циклов, мне нужно, чтобы это было эффективно. Большое спасибо заранее

ответ

0

Вы можете просто использовать merge() метод:

In [30]: cols = ['code1','code2'] 

In [31]: pd.merge(df1, df2[cols], on=cols) 
Out[31]: 
    code1 code2 column1 
0  B  0 value2 
1  C  1 value3 
2  C  1 value4 

UPDATE:

что, если я хочу, чтобы сохранить удаленные случаи в другом dataframe?

In [62]: pd.merge(df1, df2[cols], on=cols, how='left', indicator=True).query("_merge == 'left_only'") 
Out[62]: 
    code1 code2 column1  _merge 
0  A  1 value1 left_only 
4  D  1 value5 left_only 
+0

Спасибо! И что, если я хочу сохранить удаленные случаи в другом фрейме данных ??? –

+0

@ emilio.molina, посмотрите пожалуйста UPDATE – MaxU

+0

безупречный, большое спасибо !! поэтому «индикатор» - это параметр, который решает, какую часть блока данных вы сохраняете, не так ли? –

0

Я бы установить индекс для столбцов, которые вы хотите, и выполнить объединение:

df1=df1.set_index(['code1','code2'])  
df2=df2.set_index(['code1','code2']) 
In [90]: df1.join(df2) 
Out[90]: 
      column1 column2 
code1 code2     
A  1  value1  NaN 
B  0  value2 valuey 
C  1  value3 valuez 
     1  value4 valuez 
D  1  value5  NaN 

Чтобы избавиться от NaN: dropna

df1.join(df2) 
Out[94]: 
      column1 column2 
code1 code2     
B  0  value2 valuey 
C  1  value3 valuez 
     1  value4 valuez 

, а затем вы можете отказаться от индекса, если вы не хотите его с помощью reset_index():

df1.join(df2).dropna().reset_index() 
Out[95]: 
    code1 code2 column1 column2 
0  B  0 value2 valuey 
1  C  1 value3 valuez 
2  C  1 value4 valuez 
+0

это нормально. Большое спасибо. Однако у меня две проблемы. Во-первых, я поставил вопрос в этом смысле, но на самом деле я хотел сохранить другие значения, т. Е. Значения с NaN в столбце 2. Моя вторая проблема заключается в том, что df2 имеет много столбцов (63). Так что я делаю так, чтобы удалить все добавленные столбцы, что-то довольно ужасное .... –

+0

, кстати, извините, но я не могу добавить очки, пока не получу 15 репутации, поэтому я не могу принять ваш ответ .. Я уверен, что кто-то еще это сделает, не волнуйся –

+0

ok Я сделал это. однако, хотя ваш ответ был полезен, он не полностью решает мою проблему, и я хотел бы получить другие ответы ... Я не знаю, будут ли другие вопросы по этому вопросу, если они были отмечены как решены ... –