Подтвердить что ты не робот

Pandas/Python: Как объединить два кадра данных без дубликатов?

Я хотел бы объединить два dataframes A, B в новый без повторяющихся строк (если строки из B уже существуют в A, не добавляйте):

Dataframe A: Dataframe B:

   I    II    I    II
0  1    2     5    6
1  3    1     3    1

Новый Dataframe:

     I    II
  0  1    2
  1  3    1
  2  5    6

Как я могу это сделать?

4b9b3361

Ответ 1

Самый простой способ - просто выполнить конкатенацию, а затем удалить.

>>> df1
   A  B
0  1  2
1  3  1
>>> df2
   A  B
0  5  6
1  3  1
>>> pandas.concat([df1,df2]).drop_duplicates().reset_index(drop=True)
   A  B
0  1  2
1  3  1
2  5  6

reset_index(drop=True) должен зафиксировать индекс после concat() и drop_duplicates(). Без него у вас будет индекс [0,1,0] вместо [0,1,2]. Это может вызвать проблемы для дальнейших операций с этим dataframe по дороге, если это не reset сразу.

Ответ 2

Если у вас есть дублирующаяся строка уже в DataFrame A, а затем конкатенация и последующее удаление повторяющихся строк будут удалять строки из DataFrame A, которые вы, возможно, захотите сохранить.

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

Вот пример:

df_1 = pd.DataFrame([
{'date':'11/20/2015', 'id':4, 'value':24},
{'date':'11/20/2015', 'id':4, 'value':24},
{'date':'11/20/2015', 'id':6, 'value':34},])

df_2 = pd.DataFrame([
{'date':'11/20/2015', 'id':4, 'value':24},
{'date':'11/20/2015', 'id':6, 'value':14},
])


df_1['count'] = df_1.groupby(['date','id','value']).cumcount()
df_2['count'] = df_2.groupby(['date','id','value']).cumcount()

df_tot = pd.concat([df_1,df_2], ignore_index=False)
df_tot = df_tot.drop_duplicates()
df_tot = df_tot.drop(['count'], axis=1)
>>> df_tot

date    id  value
0   11/20/2015  4   24
1   11/20/2015  4   24
2   11/20/2015  6   34
1   11/20/2015  6   14