объединить два кадра данных панд на основе сравнения столбцов и пропустить общие столбцы справа - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь объединить два фрейма данных панд (DF-1 и DF-2), используя общий столбец (datetime) (я импортировал оба фрейма данных из CSV-файлов).Я хочу добавить необычные столбцы из DF-2 в DF-1, игнорируя все общие столбцы из DF-2.

DF-1

date       time  open   high   low    close      datetime         col1            
2018-01-01 09:15  11    14     17     20     2018-01-01 09:15:00  101
2018-01-01 09:16  12    15     18     21     2018-01-01 09:16:00  102
2018-01-01 09:17  13    16     19     22     2018-01-01 09:17:00  103

DF-2

date       time  open   high   low    close      datetime         col2            
2018-01-01 09:15 23     26     29     32     2018-01-01 09:15:00  104
2018-01-01 09:16 24     27     30     33     2018-01-01 09:16:00  105
2018-01-01 09:17 25     28     31     34     2018-01-01 09:17:00  106

объединенный DF (я хочу)

date       time  open   high   low    close   datetime          col1   col2        
2018-01-01 09:15  11    14     17     20   2018-01-01 09:15:00  101    104
2018-01-01 09:16  12    15     18     21   2018-01-01 09:16:00  102    105
2018-01-01 09:17  13    16     19     22   2018-01-01 09:17:00  103    106

Используемый код: merged_left = pd.merge(left=DF1,right=DF2, how='left', left_on='datetime', right_on='datetime')

Что я получу: объединены ли два данных с общими столбцами с именем time_x, open_x,high_x, low_x, close_x, time_y, open_y, high_y, low_y, close_y, col1, col2

Я хочу игнорировать все _y столбцы и сохранять _x

Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

Вы можете создать представление списка со всеми столбцами '_y', а затем передать его в pandas.drop

drop_labels = [col for col in merged_left.columns if col.find('_y') > 0]
merged_left.drop(drop_labels,axis = 1,inplace = True)

В результате останутся все уникальные столбцы и _xстолбцы

0 голосов
/ 18 сентября 2018

Вы можете использовать suffixes, чтобы удостовериться, что второй фрейм данных имеет столбцы дублирования, названные определенным образом.Затем вы можете отфильтровать столбцы с помощью filter

>>> df1
   a  b
0  1  2
>>> df2
   a  b  c
0  1  2  3
>>> df1.merge(df2, on=['a'], suffixes=['', '_y'])
   a  b  b_y  c
0  1  2    2  3
>>> df1.merge(df2, on=['a'], how='left', suffixes=['', '_y']).filter(regex='^(?!_y).$', axis=1)
   a  b  c
0  1  2  3

- Правка - я считаю, что фильтрация столбцов дублирования полезна, потому что вы можете иметь произвольное количество дубликатов, и оно их удалит.Вам не нужно явно передавать имена столбцов, которые вы хотите сохранить

0 голосов
/ 18 сентября 2018

Вы можете отфильтровать столбец в пределах merge

pd.merge(left=DF1,right=DF2[['datetime','col2']], how='left', left_on='datetime', right_on='datetime')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...