Pandas левое соединение, возвращающее несколько строк - PullRequest
0 голосов
/ 22 января 2020

Я использую python для объединения двух фреймов данных:

join=pd.merge(df1,df2,on=["A","B"],how="left")

Таблица 1:

         A   B
         a   1
         b   2
         c   3

Таблица 2:

         A   B  Flag   C
         a   1   0    20
         b   2   1    40 
         c   3   0    60
         a   1   1    80
         b   2   0    10

Результат, который я получаю после левого соединения:

         A   B  Flag  C
         a   1   0    20
         a   1   1    80
         b   2   1    40
         b   2   0    10  
         c   3   0    60 

Здесь мы видим, что строка 1 и строка 2 пришли дважды из-за таблицы 2. Я хочу сохранить только одну строку на основе Flag колонка. Я хочу сохранить одну из двух строк, чье значение Falg равно `= 1

Итак, итоговый ожидаемый результат:

          A   B  Flag  C
           a   1   1   80
           b   2   1   40
           c   3   0   60

Есть ли какой-либо способ сделать это на pythoni c

Ответы [ 3 ]

0 голосов
/ 26 января 2020
# raise preferred lines to the top
df2 = df2.sort_values(by='Flag', ascending=False) 

# deduplicate
df2 = df2.drop_duplicates(subset=['A','B'],  keep='first')

# merge
pd.merge(df1, df2, on=['A','B'])

   A  B  Flag   C
0  a  1     1  80
1  b  2     1  40
2  c  3     0  60
0 голосов
/ 26 января 2020

Попробуйте использовать это объединение:

join=pd.merge(df1,df2,on=["A","B"],how="left", left_index=True, right_index=True)
print(join)
0 голосов
/ 22 января 2020

Концепция аналогична той, что вы делаете на SQL: отделите таблицу с помощью критерия выбора (в данном случае это максимумы для флага), оставив достаточно столбцов, чтобы соответствовать наблюдению в объединенной таблице.

join = pd.merge(df1, df2, how="left").reset_index()
maximums = join.groupby(by='A').max()
join = pd.merge(join, maximums, on=['Flag', 'A'])
...