Объединение выбранных столбцов из двух фреймов данных в пандах Python - PullRequest
0 голосов
/ 02 января 2019

Я пытаюсь объединить некоторые столбцы в моем фрейме данных в python pandas. Скажем, у меня есть следующие фреймы данных:

df1 [ 'Head', 'Body', 'feat1', 'feat2']

df2 [ 'Head', 'Body', 'feat3', 'feat4']

Я хочу объединить кадры данных в:

merged_df [ 'Head', 'Body', 'feat1', 'feat2', 'feat3', feat4' ]

Интуитивно я сделал это:

merged_df = pd.concat([df1, df2['feat3','feat4'],axis=1)

Это не сработало. Я сделал свое исследование и сделал это:

merged_df = 
df1[['Head','Body','feat1','feat2']].merge(df2[['Head','feat3','feat4']], 
on='Head', how='left')

Это сработало, но вызвало некоторые расхождения в моих данных. Оказывается, некоторые из моих данных «Head» не являются уникальными. Поэтому сейчас я просто ищу наиболее простой способ объединения выбранных столбцов из DF2 в мой DF1. Обратите внимание, что оба кадра данных следуют в одном и том же порядке, поэтому строка 1 в DF1 напрямую связана со строкой 1 в DF2, поэтому строка 8120-й и т. Д.

Спасибо

Ответы [ 2 ]

0 голосов
/ 02 января 2019

в качестве примера, давайте предположим, что у нас есть два DataFrame как df1 и df2, поэтому, если значения столбцов одинаковы или уникальны, вы просто выполняете объединение, которое выровняет столбцы по вашему желанию.

$ df1
   Head  Body  feat1  feat2
0     1     1      1      1
1     2     2      2      2
2     3     3      3      3


$ df2
   Head  Body  feat3  feat4
0     1     1      1      1
1     2     2      2      2
2     3     3      3      3

Шаг 1 решение:

>>> pd.merge(df1, df2, on=['Head',  'Body'])
   Head  Body  feat1  feat2  feat3  feat4
0     1     1      1      1      1      1
1     2     2      2      2      2      2
2     3     3      3      3      3      3

Во-вторых , если у вас значения столбцов отличаются следующим образом, вы можете использовать pd.concat или pd.merge:

$ df1
   Head  Body  feat1  feat2
0     1     1      1      1
1     2     2      2      2
2     3     3      3      3

$ df2
   Head  Body  feat3  feat4
0     4     1      1      1
1     5     2      2      2
2     6     3      3      3

Шаг 2 решения:

Если вы хотите использовать объединение ключей из обоих кадров, то вы можете сделать это с помощью concat и merge следующим образом:

>>> pd.concat([df1,df2], join="outer", sort=False)
   Head  Body  feat1  feat2  feat3  feat4
0     1     1    1.0    1.0    NaN    NaN
1     2     2    2.0    2.0    NaN    NaN
2     3     3    3.0    3.0    NaN    NaN
0     4     1    NaN    NaN    1.0    1.0
1     5     2    NaN    NaN    2.0    2.0
2     6     3    NaN    NaN    3.0    3.0


>>> pd.merge(df1, df2, on=['Head',  'Body'], how='outer')
   Head  Body  feat1  feat2  feat3  feat4
0     1     1    1.0    1.0    NaN    NaN
1     2     2    2.0    2.0    NaN    NaN
2     3     3    3.0    3.0    NaN    NaN
3     4     1    NaN    NaN    1.0    1.0
4     5     2    NaN    NaN    2.0    2.0
5     6     3    NaN    NaN    3.0    3.0

Или вы можете выбрать:

а) если вы хотите использовать клавиши из левой рамки

pd.merge(df1, df2, on=['Head',  'Body'], how='left')

б) если вы хотите использовать ключи из правой рамки

pd.merge(df1, df2, on=['Head',  'Body'], how='right')

По умолчанию требуется «внутренний».

inner: использовать пересечение ключей из обоих фреймов, аналогично SQL внутреннее соединение; сохранить порядок левых клавиш

Вы можете увидеть DataFrame.merge для подробностей ..

Посмотрев на ваш обходной путь, вы хотите использовать ключи от left frame

>>> pd.merge(df1, df2, on=['Head',  'Body'], how='left')
   Head  Body  feat1  feat2  feat3  feat4
0     1     1      1      1    NaN    NaN
1     2     2      2      2    NaN    NaN
2     3     3      3      3    NaN    NaN
0 голосов
/ 02 января 2019

Я думаю, вам нужно присвоить значение, и оно будет игнорировать индекс

df1['feat3']=df2['feat3'].values
df1['feat4']=df2['feat4'].values
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...