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

У меня есть несколько подкадров данных, которые я читаю из файлов CSV, и я хочу объединить их в один большой DataFrame, используя pandas.

Моя проблема заключается в том, что некоторые столбцы в отдельных подкадрахФреймы данных показывают перекрытие.И если они это сделают, значения должны быть вставлены в правильном месте в окончательном DataFrame.

Как правило, все под-DataFrames имеют столбец ID - set всех ID значенийвсе эти DataFrames должны объединяться в последний большой столбец DataFrame ID.

Каждому ID назначен определенный CODE, который является согласованным для всех подкадров DataFrame, поэтому потенциально может бытьвсегда перезаписывается, так как значения должны оставаться неизменными.

Я пробовал всевозможные способы, merge, join, concat и даже простой старый цикл и индекс, со столбцом индекса, без,Вы называете это - но безрезультатно.

Я хочу добавить, что некоторые методы создают новые столбцы с суффиксами - но я намерен объединить все значения из перекрывающихся столбцов в один столбец, так что это не вариант /

Вотнекоторые примеры данных:

import pandas as pd
import numpy as np

np.random.seed(42)

df_1 = pd.DataFrame({
    'ID':[3,4,5,6],
    'CODE':[2,2,5,4],
    'M1':np.random.rand(4),
    'M2':np.random.rand(4)    
})

df_2 = pd.DataFrame({
    'ID':[8,9,10],
    'CODE':[7,2,4],
    'M1':np.random.rand(3),
    'M2':np.random.rand(3)    
})


df_3 = pd.DataFrame({
    'ID':[3,4,5,6],
    'CODE':[2,2,5,4],
    'M3':np.random.rand(4),
    'M4':np.random.rand(4)    
})

df_4 = pd.DataFrame({
    'ID':[8,9,10],
    'CODE':[7,2,4],
    'M3':np.random.rand(3),
    'M4':np.random.rand(3)    
})

df_5 = pd.DataFrame({
    'ID':[8,9,10],
    'CODE':[7,2,4],
    'M5':np.random.rand(3),
    'M6':np.random.rand(3)    
})

Используя merge с how="outer", я смог объединить df_1, df_2 и df_3 с результатом, который мне нужен.

ID  CODE    M1  M2  M3  M4
0   3   2   0.374540    0.156019    0.181825    0.431945
1   4   2   0.950714    0.155995    0.183405    0.291229
2   5   5   0.731994    0.058084    0.304242    0.611853
3   6   4   0.598658    0.866176    0.524756    0.139494
4   8   7   0.601115    0.969910    NaN         NaN
5   9   2   0.708073    0.832443    NaN         NaN
6   10  4   0.020584    0.212339    NaN         NaN

Но при добавлении df_4 данные добавляются ниже, а не вставляются в правильные места (поэтому в этом случае не будет NaN с):

    ID  CODE      M1          M2          M3          M4
0   3   2   0.374540    0.156019    0.181825    0.431945
1   4   2   0.950714    0.155995    0.183405    0.291229
2   5   5   0.731994    0.058084    0.304242    0.611853
3   6   4   0.598658    0.866176    0.524756    0.139494
4   8   7   0.601115    0.969910    NaN         NaN
5   9   2   0.708073    0.832443    NaN         NaN
6   10  4   0.020584    0.212339    NaN         NaN
7   8   7   NaN         NaN        0.292145     0.785176
8   9   2   NaN         NaN        0.366362     0.199674
9   10  4   NaN         NaN        0.456070     0.514234

Наконец, объединениевсе DataFrames в этом примере должны давать такой результат:

    ID  CODE      M1          M2          M3          M4     M5         M6
0   3   2   0.374540    0.156019    0.181825    0.431945    NaN         NaN
1   4   2   0.950714    0.155995    0.183405    0.291229    NaN         NaN
2   5   5   0.731994    0.058084    0.304242    0.611853    NaN         NaN
3   6   4   0.598658    0.866176    0.524756    0.139494    NaN         NaN
4   8   7   0.601115    0.969910    0.292145    0.785176    0.592414    0.170524
5   9   2   0.708073    0.832443    0.366362    0.199674    0.046450    0.065051
6   10  4   0.020584    0.212339    0.456070    0.514234    0.607544    0.948885

1 Ответ

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

Объедините кадры данных с одинаковыми идентификатором и кодами и объедините их.

pd.concat([df_1.merge(df_3, how = 'outer'),df_2.merge(df_4, how = 'outer').merge(df_5, how = 'outer')], sort = True)

    ID  CODE    M1      M2          M3          M4          M5          M6
0   3   2   0.374540    0.156019    0.181825    0.431945    NaN         NaN
1   4   2   0.950714    0.155995    0.183405    0.291229    NaN         NaN
2   5   5   0.731994    0.058084    0.304242    0.611853    NaN         NaN
3   6   4   0.598658    0.866176    0.524756    0.139494    NaN         NaN
4   8   7   0.601115    0.969910    0.292145    0.785176    0.592415    0.170524
5   9   2   0.708073    0.832443    0.366362    0.199674    0.046450    0.065052
6   10  4   0.020584    0.212339    0.456070    0.514234    0.607545    0.948886

Другое решение, использующее groupby.Concat всех фреймов данных по оси 0, groupby по ID, CODE и first () возвращает первое не-NaN значение.

dfs = [df_1, df_2, df_3, df_4, df_5]

pd.concat(dfs, sort = False).groupby(['CODE', 'ID']).first().sort_index(level = 1).reset_index()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...