【问题标题】:Adding a new row to a dataframe in pandas for every iteration为每次迭代在 pandas 中的数据框中添加一个新行
【发布时间】:2019-03-27 17:17:42
【问题描述】:

Adding a new row to a dataframe with correct mapping in pandas

与上述问题类似。

      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_identifierwellthie_issuer_identifierhios_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) 

【问题讨论】:

  • 您希望在什么条件下将id 添加回原始数据框?这些列carrier_plan_identifier, wellthie_issuer_identifier and hios_issuer_identifier 是否也存在于您的数据框中?

标签: python pandas


【解决方案1】:

解决问题的最简单方法是将最后一行更改为:

    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)

【讨论】:

  • 它给了我 4 行,每行 2 行,这是不正确的。用输出更新了问题
  • @user1896796 你的问题不清楚,现在怎么样?
  • 这是抛出错误。我不知道为什么。有没有什么更简单的事情可以不使用 lambda 来完成。
【解决方案2】:

试试这个:

考虑到您要根据以下 3 列更新原始 df:

1.) 调整您在 DB 上触发的查询以在 select 子句中包含列:carrier_plan_identifier, wellthie_issuer_identifier and hios_issuer_identifier

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 这个dforiginal_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) 与carrier_plan_identifier、wellthie_issuer_identifier 和hios_issuer_identifier 列上的original df 一起加入,并附加id 列,因为它不存在。 无论在哪里找到匹配项,来自 df 的 id 列的值将被复制到 original_df 并且在没有匹配的情况下,id 列将具有 NaN。 您不必使用任何循环。试试我的代码吧。

这将为所有匹配的行添加id 列到original_df。对于没有找到匹配的行,将有id as Nan

您可以将Nan 替换为任何值,如下所示:

original_df = original_df.fillna("")

如果这有帮助,请告诉我。

【讨论】:

  • 我更新了问题,你想让我在循环中调用它吗?
  • 首先,请告诉我您要在哪些列上添加 id 到原始框架?那么只有我能给你一个合适的解决方案。
  • 我有一个df,可以说[2 rows x 106 columns]。我想使用 carrier_plan_identifier, wellthie_issuer_identifier and hios_issuer_identifier 的值添加一个 id 列。这些在我的数据框中。单个选择查询返回多行,但我可以将 LIMIT 设置为 1。然后我的最终数据框将有 [2 rows x 107 columns]。如果没有,您可以创建一个我们可以讨论的聊天室吗?会有很大帮助。
  • 那么,您的选择查询的输出应该被摄取到数据框中,对吧?这里有 2 个案例,a)output of select query is already present in the dataframeb) output of select query is not present in dataframe。检查我更新的答案。
猜你喜欢
  • 1970-01-01
  • 2021-02-02
  • 1970-01-01
  • 2023-01-16
  • 2010-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-31
相关资源
最近更新 更多