Слияние нескольких панелей данных - PullRequest
0 голосов
/ 30 июня 2018

Я пытаюсь объединить несколько новых фреймов данных в основной. Предположим, основной кадр данных:

      key1           key2
0   0.365803    0.259112
1   0.086869    0.589834
2   0.269619    0.183644
3   0.755826    0.045187
4   0.204009    0.669371

И я пытаюсь объединить 2 следующих набора данных в основной,
Новые данные1:

        key1    key2    new feature
0   0.365803    0.259112    info1

Новые данные2:

        key1    key2    new feature
0   0.204009    0.669371    info2

Ожидаемый результат:

       key1       key2  new feature
0   0.365803    0.259112    info1
1   0.776945    0.780978    NaN
2   0.275891    0.114998    NaN
3   0.667057    0.373029    NaN
4   0.204009    0.669371    info2

Что я пробовал:

test = test.merge(data1, left_on=['key1', 'key2'], right_on=['key1', 'key2'], how='left')
test = test.merge(data2, left_on=['key1', 'key2'], right_on=['key1', 'key2'], how='left')

Хорошо работает для первого, но не для второго, результат, который я получаю:

        key1    key2    new feature_x   new feature_y
0   0.365803    0.259112    info1      NaN
1   0.776945    0.780978    NaN        NaN
2   0.275891    0.114998    NaN        NaN
3   0.667057    0.373029    NaN        NaN
4   0.204009    0.669371    NaN       info2

Спасибо за вашу помощь!

Ответы [ 3 ]

0 голосов
/ 30 июня 2018

Сначала append или concat вместе DataFrame с, а затем merge:

dat = pd.concat([data1, data2], ignore_index=True)

Или:

dat = data1.append(data2, ignore_index=True)

print (dat)
       key1      key2 new feature
0  0.365803  0.259112       info1
1  0.204009  0.669371       info2

#if same joined columns names better is only on parameter
df = test.merge(dat, on=['key1', 'key2'], how='left')

print (df)
       key1      key2 new feature
0  0.365803  0.259112       info1
1  0.086869  0.589834         NaN
2  0.269619  0.183644         NaN
3  0.755826  0.045187         NaN
4  0.204009  0.669371       info2
0 голосов
/ 30 июня 2018

Вы также можете установить кадры данных с тем же индексом и использовать простые loc

df  = df.set_index(["key1", "key2"])
df2 = df2.set_index(["key1", "key2"])

Тогда

df.loc[:, "new_feature"] = df2['new_feature']
0 голосов
/ 30 июня 2018

Вы можете использовать pd.DataFrame.update вместо:

# create new column and set index
res = test.assign(newfeature=None).set_index(['key1', 'key2'])

# update with new data sequentially
res.update(data1.set_index(['key1', 'key2']))
res.update(data2.set_index(['key1', 'key2']))

# reset index to recover columns
res = res.reset_index()

print(res)

       key1      key2 newfeature
0  0.365803  0.259112      info1
1  0.086869  0.589834       None
2  0.269619  0.183644       None
3  0.755826  0.045187       None
4  0.204009  0.669371      info2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...