Добавление новой строки в фрейм данных в пандах для каждой итерации - PullRequest
0 голосов
/ 23 октября 2018

Добавление новой строки в фрейм данных с правильным отображением в пандах

Что-то похожее на приведенный выше вопрос.

      carrier_plan_identifier           ...            hios_issuer_identifier
1                        AUSK           ...                           99806.0
2                        AUSM           ...                           99806.0
3                        AUSN           ...                           99806.0
4                        AUSS           ...                           99806.0
5                        AUST           ...                           99806.0

Мне нужно выбрать несколько столбцов,скажем, carrier_plan_identifier, wellthie_issuer_identifier и hios_issuer_identifier.

С этими 3 столбцами мне нужно выполнить запрос выбора, что-то вроде,

select id from table_name where carrier_plan_identifier = 'something' and wellthie_issuer_identifier = 'something' and hios_issuer_identifier = 'something'

Мне нужно добавить id колонка обратно к моему существующему фрейму данных

В настоящее время я делаю что-то вроде этого,

for index, frame in df_with_servicearea.iterrows():

            if frame['service_area_id'] and frame['issuer_id']:
                # reading from medical plans table
                medical_plan_id = getmodeldata.get_medicalplans(sess, frame['issuer_id'], frame['hios_plan_identifier'], frame['plan_year'],
                                                                frame['group_or_individual_plan_type'])

                frame['medical_plan_id'] = medical_plan_id
                df_with_servicearea.append(frame)

, когда я делаю это, frame['medical_plan_id'] = medical_plan_id, ничего не добавляется.Но когда я делаю df_with_servicearea['medical_plan_id'] = medical_plan_id, ко всем строкам добавляется только последнее значение цикла.Я не уверен, что это правильный способ сделать это.

Обновление -:

После использования я получаю 4 строки вместо 2 строк, которые должны быть там.

df_with_servicearea = df_with_servicearea.append(frame)



 wellthie_issuer_identifier       ...       medical_plan_id
0                   UHC99806       ...                   NaN
1                   UHC99806       ...                   NaN
0                   UHC99806       ...              879519.0
1                   UHC99806       ...              879520.0

Обновление 2 - Реализовано на основе ответа Mayank - Привет, Mayank, Вы предлагаете что-то подобное.

для индекса, кадр в df_with_servicearea.iterrows ():

    if frame['service_area_id'] and frame['issuer_id']:
        # reading from medical plans table
        df_new = getmodeldata.get_medicalplans(sess, frame['issuer_id'], frame['hios_plan_identifier'], frame['plan_year'],
                                               frame['group_or_individual_plan_type'])
        df_new.columns = ['medical_plan_id', 'issuer_id', 'hios_plan_identifier', 'plan_year',
                          'group_or_individual_plan_type']
        new_df = pd.merge(df_with_servicearea, df_new, on=['issuer_id', 'hios_plan_identifier', 'plan_year', 'group_or_individual_plan_type'], how='left')

print new_df

моя функция get_medicalplans, где я вызываю запрос на выборку.

def get_medicalplans(self,sess, issuerid, hios_plan_identifier, plan_year, group_or_individual_plan_type):
    try:
        medical_plan = sess.query(MedicalPlan.id, MedicalPlan.issuer_id, MedicalPlan.hios_plan_identifier,
                                     MedicalPlan.plan_year, MedicalPlan.group_or_individual_plan_type).filter(MedicalPlan.issuer_id == issuerid,
                                     MedicalPlan.hios_plan_identifier == hios_plan_identifier,
                                     MedicalPlan.plan_year == plan_year,
                                     MedicalPlan.group_or_individual_plan_type == group_or_individual_plan_type)
        sess.commit()
        return pd.read_sql(medical_plan.statement, medical_plan.session.bind) 

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Попробуйте это:

Учитывая, что вы хотите обновить исходный df на основе следующих 3 столбцов:

1.) Настройте запрос, который вы запускаете на БД, чтобы включить столбцы:carrier_plan_identifier, wellthie_issuer_identifier and hios_issuer_identifier в предложении select.

select id,carrier_plan_identifier, wellthie_issuer_identifier,hios_issuer_identifier from table_name where carrier_plan_identifier = 'something' and wellthie_issuer_identifier = 'something' and hios_issuer_identifier = 'something'

2.) Создайте фрейм данных для вышеуказанных результатов.

df = pd.DataFrame(cur.fetchall())

3.) Теперь вышеdf имеет id столбец с 3 другими столбцами.Теперь merge это df с original_df на основе столбцов: carrier_plan_identifier, wellthie_issuer_identifier and hios_issuer_identifier

original_df = pd.merge(original_df,df, on=['carrier_plan_identifier','wellthie_issuer_identifier','hios_issuer_identifier'],how='outer')

Changed left join to Outer join.

Итак, вы должны понимать, что происходитВот.Я присоединяюсь к query dataframe(df) с original df по столбцам carrier_plan_identifier, wellthie_issuer_identifier и hios_issuer_identifier и добавляю столбец id, поскольку его не было.В случае обнаружения совпадения значение столбца id из df будет скопировано в original_df, а в случае отсутствия совпадения столбец id будет иметь значение NaN.Вам не нужно использовать какие-либо петли.Просто попробуйте мой код.

Это добавит столбец id к original_df для всех соответствующих строк.Для строк, которые не находят соответствия, будет id as Nan.

. Вы можете заменить Nan на любое значение, как показано ниже:

original_df = original_df.fillna("")

Дайте мне знать, если это поможет.

0 голосов
/ 23 октября 2018

Самое простое решение вашей проблемы - изменить последнюю строку на:

    df_with_servicearea = df_with_servicearea.append(frame)

Однако, если вы хотите добавить новый столбец, используйте:

df_with_servicearea['medical_plan_id'] = df_with_servicearea.apply(
    lambda row:
    getmodeldata.get_medicalplans(sess,
                                  row['issuer_id'],
                                  row['hios_plan_identifier'],
                                  row['plan_year'],
                                  row['group_or_individual_plan_type']
                                  )
    if row['service_area_id']
    and row['issuer_id']
    else np.nan)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...