Объединение нескольких фреймов данных - PullRequest
0 голосов
/ 14 мая 2019

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

Допустим, у меня есть 4 кадра данных с одинаковыми столбцами, но разными временными диапазонами (строками). Я установил дату в качестве индекса и хотел бы объединить кадры данных в один новый. Для этого я поместил кадры данных в список и попытался соединить их в цикле, но не могу заставить его работать.

При выполнении я получаю следующую ошибку:

ValueError: столбцы перекрываются, но суффикс не указан: индекс (['attr1', 'attr2'], dtype = 'object'

По умолчанию "join" должен присоединяться к индексу, поэтому мне интересно, почему возникает эта ошибка?!

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

Вот код:

import pandas as pd
import numpy as np

df1 = pd.DataFrame(np.array([
    ['2019-04-29', 5, 9],
    ['2019-04-28', 4, 61],
    ['2019-04-27', 24, 9]]),
    columns=['Date', 'attr1', 'attr2'])
df1 = df1.set_index(['Date'])

df2 = pd.DataFrame(np.array([
    ['2019-04-25', 5, 19],
    ['2019-04-24', 14, 16],
    ['2019-04-23', 4, 9]]),
    columns=['Date', 'attr1', 'attr2'])
df2 = df2.set_index(['Date'])

df3 = pd.DataFrame(np.array([
    ['2019-04-29', 15, 49],
    ['2019-04-25', 4, 36],
    ['2019-04-23', 14, 9]]),
    columns=['Date', 'attr1', 'attr2'])
df3 = df3.set_index(['Date'])

df4 = pd.DataFrame(np.array([
    ['2019-04-29', 15, 49],
    ['2019-04-10', 4, 36],
    ['2019-04-5', 14, 9]]),
    columns=['Date', 'attr1', 'attr2'])
df4 = df4.set_index(['Date'])

dfs = [df1, df2, df3, df4]

for df in (dfs):
    df.join(df, how='outer')

Требуемый формат выглядит следующим образом:

df5 = pd.DataFrame(np.array([
['2019-04-29', 15, 49, 5, 19, 15, 49, 15, 49],
['2019-04-10', 4, 36, 14, 16, 4, 36, 4, 36],
['2019-04-5', 14, 9, 4, 36, 4, 36, 4, 36]]),
columns=['Date', 'attr1_x', 'attr2_x', 'attr1_y', 'attr2_y', 'attr1_z', 'attr2_z', 'attr1_v', 'attr2_v'])
df5 = df5.set_index(['Date'])

1 Ответ

1 голос
/ 14 мая 2019
>>> from functools import reduce
>>> df_final = reduce(lambda left,right: pd.merge(left,right, how='outer', left_on='Date', right_on='Date'), dfs)
>>> df_final
        attr1_x attr2_x attr1_y attr2_y attr1_x attr2_x attr1_y attr2_y
Date                                                                      
2019-04-29       5       9     NaN     NaN      15      49      15      49
2019-04-28       4      61     NaN     NaN     NaN     NaN     NaN     NaN
2019-04-27      24       9     NaN     NaN     NaN     NaN     NaN     NaN
2019-04-25     NaN     NaN       5      19       4      36     NaN     NaN
2019-04-24     NaN     NaN      14      16     NaN     NaN     NaN     NaN
2019-04-23     NaN     NaN       4       9      14       9     NaN     NaN
2019-04-10     NaN     NaN     NaN     NaN     NaN     NaN       4      36
2019-04-5      NaN     NaN     NaN     NaN     NaN     NaN      14       9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...