Как найти похожие значения из двух столбцов разных фреймов? - PullRequest
0 голосов
/ 10 марта 2020

Например, у меня есть два фрейма данных, которые выглядят следующим образом

df1
c1           c2   c3   c4   c5   c6   c7
2006-01-02 10:45 xxx0 yyy0 zzz0 rrr0 sss0
2006-01-02 11:00 xxx1 yyy1 zzz1 rrr1 sss1
2006-01-03 11:15 xxx2 yyy2 zzz2 rrr2 sss2
2006-01-03 11:30 xxx3 yyy3 zzz3 rrr3 sss3
2006-01-04 11:45 xxx4 yyy4 zzz4 rrr4 sss4
2006-01-05 11:00 xxx5 yyy5 zzz5 rrr5 sss5

df2
c1           c2     c3   c4 
2006-01-02  10:45  aaa0 bbb0 
2006-01-03  11:30  aaa1 bbb1
2006-01-04  10:40  aaa2 bbb2
2006-01-05  11:00  aaa3 bbb3

Я хочу отредактировать два столбца df1 так, чтобы он содержал значения, которые являются общими для столбцов c1 и c2 df1 и df2

Вывод:

df1
c1           c2   c3   c4   c5   c6   c7
2006-01-02 10:45 xxx0 yyy0 zzz0 rrr0 sss0
2006-01-03 11:30 xxx3 yyy3 zzz3 rrr3 sss3
2006-01-05 11:00 xxx5 yyy5 zzz5 rrr5 sss5

То, что я пробовал, это

dfnewdate = df1[(df1[c1].isin(df2[c1])]
df1 = dfnewdate
dfnewtime = df1[(df1[c2].isin(df2[c2])]
df1 = dfnewtime

Дата была успешно отфильтрована, за исключением того, что она пропущена первый ряд df1 и не отфильтровывает время (у него все еще есть второй ряд старого df1).

My output
df1
c1           c2   c3   c4   c5   c6   c7
2006-01-02 10:45 xxx0 yyy0 zzz0 rrr0 sss0
2006-01-02 11:00 xxx1 yyy1 zzz1 rrr1 sss1
2006-01-03 11:15 xxx2 yyy2 zzz2 rrr2 sss2
2006-01-03 11:30 xxx3 yyy3 zzz3 rrr3 sss3
2006-01-05 11:00 xxx5 yyy5 zzz5 rrr5 sss5

Что-то не так с моим кодом? Есть ли альтернативный способ сделать это?

1 Ответ

0 голосов
/ 10 марта 2020

Есть много способов сделать это. Я покажу вам три.

1) Использование .loc и .isin()

df1.loc[(df1['c1'].isin(df2['c1']))&(df1['c2'].isin(df2['c2']))]

2) Использование .join() (с внутренним объединением, когда вы устанавливаете каждый столбец на индекс, вы можете использовать .merge так же легко)

df1.set_index(['c1','c2']).join(df2.set_index(['c1','c2']), how = 'inner').reset_index()

3) Использование pd.concat() с .duplicated(). Здесь вы объединяете оба столбца df, а затем ищите дублирующиеся строки.

df3 = pd.concat([df1,df2])
df3[df3.duplicated()]

РЕДАКТИРОВАТЬ:

Это должно работать:

df1.loc[(df1['c1']+' '+df1['c2']).isin(df2['c1']+' '+df2['c2'])]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...