Присоединиться к сложным столам панд - PullRequest
0 голосов
/ 19 апреля 2019

Я пытаюсь соединить фрейм данных результатов из GLS statsmodels с фреймом данных, предназначенным для хранения как одномерных данных, так и результатов моделей, когда модели проходят итерацию.У меня проблемы с выяснением, как грамматически объединить два набора данных.

Я ознакомился с документацией панд, найденной ниже, но не повезло:

https://pandas.pydata.org/pandas-docs/stable/user_guide/merging.html#database-style-dataframe-or-named-series-joining-merging

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

Посмотрите пример того, как выглядят данные, с помощью приведенного ниже кода:

import pandas as pd

df = {'variable': ['CLded_model','CLded_model','CLded_model','CLded_model','CLded_model','CLded_model','CLded_model'
                  ,'channel_model','channel_model','channel_model']
      , 'level': [0,100,200,250,500,750,1000, 'DIR', 'EA', 'IA']
      ,'value': [460955.7793,955735.0532,586308.4028,12216916.67,48401773.87,1477842.472,14587994.92,10493740.36
               ,36388470.44,31805316.37]}

final_table = pd.DataFrame(df)


df2 = {'variable': ['intercept','C(channel_model)[T.EA]','C(channel_model)[T.IA]', 'CLded_model']
       , 'coefficient': [-2.36E-14,-0.091195797,-0.244225888, 0.00174356]}

model_results = pd.DataFrame(df2)

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

В этом есть много чего, и я не уверен, с чего начать.

Обновление: следующий код дает желаемый результат:

d3 = {'variable': ['intercept', 'CLded_model','CLded_model','CLded_model','CLded_model','CLded_model','CLded_model'
                   ,'CLded_model','channel_model','channel_model','channel_model']
      , 'level': [None, 0,100,200,250,500,750,1000, 'DIR', 'EA', 'IA']
      ,'value': [None, 60955.7793,955735.0532,586308.4028,12216916.67,48401773.87,1477842.472,14587994.92,10493740.36
               ,36388470.44,31805316.37]
      , 'coefficient': [ -2.36E-14, 0.00174356,  0.00174356,  0.00174356,  0.00174356,  0.00174356 ,0.00174356
                        , 0.00174356,None, -0.091195797,-0.244225888, ]}

desired_result = pd.DataFrame(d3)

1 Ответ

1 голос
/ 20 апреля 2019

Сначала нужно очистить df2:

df2['variable'] = df2['variable'].str.replace("C\(","")\
                                 .str.replace("\)\[T.", "-")\
                                 .str.strip("\]")

df2


       variable          coefficient
0   intercept           -2.360000e-14
1   channel_model-EA    -9.119580e-02
2   channel_model-IA    -2.442259e-01
3   CLded_model          1.743560e-03

Поскольку вы хотите объединить некоторые из df1 в столбце уровня, а другие нет, нам нужно немного изменить df1, чтобы соответствовать df2:

df1.loc[df1['variable'] == 'channel_model', 'variable'] = "channel_model-"+df1.loc[df1['variable'] == 'channel_model', 'level']

df1

#snippet of what changed
      variable         level     value
6   CLded_model        1000   1.458799e+07
7   channel_model-DIR   DIR   1.049374e+07
8   channel_model-EA    EA    3.638847e+07
9   channel_model-IA    IA    3.180532e+07

Тогда мы объединяем их:

df4 = df1.merge(df2, how = 'outer', left_on =['variable'], right_on = ['variable'])

И мы получим ваш результат (за исключением незначительного изменения в имени переменной)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...