Объединение / объединение фреймов данных

#python #pandas #dataframe

#python #панды #фрейм данных

Вопрос:

У меня много фреймов данных, и мне нужно объединить / объединить их все. DF1 является основным / основным фреймом данных, а затем есть много меньших фреймов данных, содержащих key1 и key2. Для данной пары key1 и key2 будет только 1 строка во всех фреймах данных, отличных от основного. Прямо сейчас я перебираю все фреймы данных и объединяю их один за другим в master / result, поэтому я получаю много columns_x и columns_y

Я делаю что-то вроде этого

 result = pd.merge(df1, df2, how='outer',on=['key1', 'key2'])
result = pd.merge(result, df3, how='outer',on=['key1', 'key2'])
result = pd.merge(result, df4, how='outer',on=['key1', 'key2'])
  

Прилагается изображение фреймов данных и результат, который я хочу видеть.

Не мог бы кто-нибудь, пожалуйста, помочь мне здесь. введите описание изображения здесь

Ответ №1:

Вы можете объединить совместимые фреймы данных по вертикали (df2, df3 и df4), а затем объединить их по горизонтали с df1 следующим образом :

 df1 = pd.DataFrame({'key1': [1, 1, 1, 1, 1, 1], 'key2': [1, 2, 3, 4, 5, 6], 'A': ['A1', 'A2', 'A3', 'A4', 'A5', 'A6'],
                    'B': ['B1', 'B2', 'B3', 'B4', 'B5', 'B6'], 'C': ['C1', 'C2', 'C3', 'C4', 'C5', 'C6']})
df2 = pd.DataFrame({'key1': [1, 1], 'key2': [3, 4], 'D': ['D1', 'D2'], 'E': ['E1', 'E2'], 'F': ['F1', 'F2']})
df3 = pd.DataFrame({'key1': [1, 1], 'key2': [1, 5], 'G': ['G1', 'G2'], 'H': ['H1', 'H2']})
df4 = pd.DataFrame({'key1': [1, 1], 'key2': [2, 6], 'I': ['I1', 'I2'], 'J': ['J1', 'J2'], 'D': ['D1_DF4', 'D2_DF4'],
                    'G': ['G1_DF4', 'G2_DF4']})

df_concat = pd.concat([df2, df3, df4], sort=False, ignore_index = True)
df_merge = pd.merge(df1, df_concat, on=['key1', 'key2'], how = 'outer')
df_merge
  

Выходной сигнал :

    key1  key2   A   B   C       D    E    F       G    H    I    J
0     1     1  A1  B1  C1     NaN  NaN  NaN      G1   H1  NaN  NaN
1     1     2  A2  B2  C2  D1_DF4  NaN  NaN  G1_DF4  NaN   I1   J1
2     1     3  A3  B3  C3      D1   E1   F1     NaN  NaN  NaN  NaN
3     1     4  A4  B4  C4      D2   E2   F2     NaN  NaN  NaN  NaN
4     1     5  A5  B5  C5     NaN  NaN  NaN      G2   H2  NaN  NaN
5     1     6  A6  B6  C6  D2_DF4  NaN  NaN  G2_DF4  NaN   I2   J2
  

Комментарии:

1. Он отлично работает, когда у меня меньший набор данных, но мне не хватает памяти для большего набора данных. Я говорю о 100000 строках с примерно 90 столбцами. Я пытался использовать циклы и удалять промежуточные фреймы данных, а также переустанавливать python64. Но у меня все еще есть проблема с памятью. У кого-нибудь есть какое-либо решение по решению проблемы памяти. Использование Windows.

Ответ №2:

Почему бы не переименовать столбцы перед объединением? В том, что вы делаете, нет ничего плохого, кроме именования столбцов. Если у вас есть столбцы с одинаковыми именами:

 import pandas as pd

af = pd.DataFrame(data=[[1,1,'A1','B1','C1'],
                        [1,2,'A2','B2','C2'],
                        [1,1,'A3','B3','C3']],
                  columns=['key1', 'key2', 'A', 'B', 'C'])
af = af.set_index(['key1', 'key2'])

bf = pd.DataFrame(data=[[1,3,'D3','E3','F3'],
                        [1,4,'D4','E4','F4']],
                  columns=['key1', 'key2', 'D', 'E', 'F'])
bf = bf.set_index(['key1', 'key2'])

result = pd.merge(af, bf, how='outer',on=['key1', 'key2'])
  

дает:

              A    B    C    D    E    F
key1 key2                              
1    1      A1   B1   C1  NaN  NaN  NaN
     1      A3   B3   C3  NaN  NaN  NaN
     2      A2   B2   C2  NaN  NaN  NaN
     3     NaN  NaN  NaN   D3   E3   F3
     4     NaN  NaN  NaN   D4   E4   F4
  

Если имена столбцов равны:

  bf.columns=['A', 'B', 'C']
 result = pd.merge(af, bf, how='outer',on=['key1', 'key2'])
  

вы получаете:

            A_x  B_x  C_x  A_y  B_y  C_y
key1 key2                              
1    1      A1   B1   C1  NaN  NaN  NaN
     1      A3   B3   C3  NaN  NaN  NaN
     2      A2   B2   C2  NaN  NaN  NaN
     3     NaN  NaN  NaN   D3   E3   F3
     4     NaN  NaN  NaN   D4   E4   F4