Как найти строку с одинаковым значением в 2 столбцах между 2 кадрами данных, но разными значениями в других столбцах панд - PullRequest
0 голосов
/ 12 мая 2018

У меня есть 2 кадра данных со значением выборки, как показано ниже:

df1 :
col1 cold2 cold3 cold4
a     bb    cc    d
b     aa    ee    e


df2 :
col1 cold2 cold3 col4
a    ee    ff    d
e    gg    hh    k

Я хочу найти все строки в 2-х фреймах данных, имеющие одинаковое значение в col1 + col4, но другое значение в col2 или col3

вывод должен выглядеть так:

df3:
col1 cold2 cold3 cold4
a     bb    cc    d
a     ee    ff    d

Спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Я думаю, вы можете использовать:

#get all matched rows by columns
df = df1.merge(df2, on=['col1','col4'], suffixes=('','_'))
#filter for not matched  
df = df[df['col2'] != df['col3']]

#filter columns - same like df1
df1 = df[df1.columns]
#filter added new columns
df2 = df[df.columns.difference(df2.columns).union(['col1','col4'])]

#join together - rename values for align data 
df = pd.concat([df1, 
                df2.rename(columns=dict(zip(df2.columns, df1.columns)))],
                ignore_index=True)
print (df)
  col1 col2 col3 col4
0    a   bb   cc    d
1    a   ee   ff    d
0 голосов
/ 12 мая 2018

Вот решение с использованием duplicated и drop_duplicates. Сначала необходимо объединить два кадра данных, для чего нужно убедиться, что имена столбцов совпадают.

Если имена ваших столбцов действительно совпадают в df1 и df2, выполните:

new_df = (pd.concat([df1,df2])[pd.concat([df1,df2])
                             .duplicated(subset=['col1','cold4'], keep=False)]
           .drop_duplicates(subset=['cold2', 'cold3']))

Что возвращает:

>>> new_df

  col1 cold2 cold3 cold4
0    a    bb    cc     d
0    a    ee    ff     d

Если вам нужно переименовать столбцы в df2, чтобы они соответствовали именам столбцов df1 без изменения исходных кадров данных, вы можете просто добавить этот шаг:

concat_dfs = pd.concat([df1, df2.rename(columns={i2:i1 for i1,i2
                                         in zip(df1.columns,df2.columns)})])

new_df = (concat_dfs[concat_dfs.duplicated(subset=['col1', 'cold4'], keep=False)]
           .drop_duplicates(subset=['cold2', 'cold3']))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...