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

Я хочу добавить новый столбец в свой существующий фрейм данных.

Я делаю это,

def test(self, sess, df):

    for index, frame in df.iterrows():
        medical_plan = sess.query(MedicalPlan.id).filter(MedicalPlan.issuer_id == frame['issuer_id'],
                                  MedicalPlan.hios_plan_identifier == frame['hios_plan_identifier'],
                                  MedicalPlan.plan_year == frame['plan_year'],
                                  MedicalPlan.group_or_individual_plan_type == frame['group_or_individual_plan_type']).first()
        sess.commit()
        frame['medical_plan_id'] = list(medical_plan)[0]
        df = df.append(frame)
    print df

Значение df перед циклом,

  wellthie_issuer_identifier       ...       service_area_id
0                   UHC99806       ...                     1

[1 rows x 106 columns]

Обычно столбец и данные должны быть добавлены в эту строку.Но вместо этого я получаю 2 строки, и вставляется только последнее значение цикла.df после цикла создается столбец, но данные неверны.

 wellthie_issuer_identifier       ...       medical_plan_id
0                   UHC99806       ...                   NaN
0                   UHC99806       ...              879519.0

[2 rows x 107 columns]

Как мне этого добиться.Вывод я должен получить как показано ниже -

 wellthie_issuer_identifier       ...       service_area_id  medical_plan_id
0                   UHC99806       ...                     1    879519.0

[1 rows x 107 columns]

попробуйте 1:

Я вызвал метод get_id, как показано ниже -

 def test(self, sess, df):
        print ("in test", df)
        for index, frame in df.iterrows():
            id = self.get_id(sess, frame)
            df['medical_plan_id'] = df.apply(id, axis=1)
        print df

1 Ответ

0 голосов
/ 23 октября 2018
def test(self, sess, df):
     def get_id(frame):
            medical_plan = sess.query(MedicalPlan.id).filter(MedicalPlan.issuer_id == frame['issuer_id'],
                                          MedicalPlan.hios_plan_identifier == frame['hios_plan_identifier'],
                                          MedicalPlan.plan_year == frame['plan_year'],
                                          MedicalPlan.group_or_individual_plan_type == frame['group_or_individual_plan_type']).first()
            sess.commit()
            return list(medical_plan)[0]
      df['medical_plan_id']=df.apply(get_id, axis =1)
      print(df)  

Если вы хотите, чтобы medical_plan_id было целым числом, вы можете изменить последнюю строку get_id на return int(list(medical_plan)[0]).Кроме того, вы, вероятно, могли бы сделать

    medical_plan = sess.query(MedicalPlan.id).filter(
            all([MedicalPlan.attribute == frame.attribute for attribute in 
                 ['issuer_id','hios_plan_identifier','plan_year','group_or_individual_plan_type']])).first()

или

        attributes = ['issuer_id','hios_plan_identifier','plan_year','group_or_individual_plan_type']
        medical_plan = sess.query(MedicalPlan.id).filter(all(MedicalPlan[attributes]==frame[attributes])).first())

(я не могу точно сказать, сработает ли это, не зная, что это за объект MedicalPlan.)

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