首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >基于条件的Python递归更新

基于条件的Python递归更新
EN

Stack Overflow用户
提问于 2018-08-21 03:56:08
回答 1查看 146关注 0票数 1

我使用的是pandas,有两个数据帧:

df1

    id date status rpbid rpfid
     1  d1   closed null  10
     2  d2   closed null  11
     3  d3   closed null  null

df2

     id date status  rpbid rpfid
     10 d10  updated 1     null
     11 d11  updated 2     9
     9  d9   updated 11    null

我的想法是,我想处理两种情况: 1.关闭的记录是该实例的第一个也是最后一个记录(df1中的id 3),2.关闭的记录有一个更新的记录链接在df2中。rfbidrpbid用于replacedbyidreplacementforid,因此生成的df为:

id date status rpbid rpfid id2 date2 rpbid2 rpfip2
1  d1   closed null  10    10  d10   1      null
2  d2   closed null  11    9   d9    11     null
3  d3   closed null  null  null null  null   null

到目前为止,我已经尝试了在df1df2上执行第一个左连接,以获得所有第一个递归连接,然后尝试使用循环来检查rpbid2是否为空,如果不是,我在df1中查看df2的id列中的rpdid2值,然后我想将合并后的数据帧的后半部分更新为连接中适用的下一步。

这是原始代码:我不能得到它而不是错误

import pandas as pd

df = pd.read_csv(filename)


df_initial = df.loc[df['LetterStatus']=='CLOSED']
dfx = df.loc[df['LetterStatus']=='UPDATED']


df_merged = pd.merge(df_initial,dfx,how='left',left_on='ReferenceNumber',right_on='ReplacedByRefNumber')
df_copy = df_merged
for row in range(len(df_merged)):
    if  len(str(df_merged.iloc[row]['ReplacedByRefNumber_y'])) > 1:
        row_slice = dfx.iloc[['ReferenceNumber']==df_merged[row['ReplacedByRefNumber_y']]
        if row_slice.size == 0:
            df_merged.iloc[row]['ReplacedByRefNumber_y']='Unknown'
            df_copy.iloc[row]['ReplacedByRefNumber_y']='Unknown'
        else:
            df_copy.iloc[row][24:0]=row_slice


print(df_copy)

了解更多上下文;如果replacedbyID为null并且状态为'updated',这意味着它是该给定订单的第一条记录。

EN

回答 1

Stack Overflow用户

发布于 2018-08-21 04:45:15

免责声明:与其试图找出问题的根源来获得您想要的数据框架,我这个答案的目的是确保您完全确定您正在做什么,并可能帮助您更好地组织您的数据。

就我所见,您有两个数据框,每个数据框中都有相互的绑定来更新它们的内容;问题是您正在展示一个示例,其中要更新另一个数据框中的另一个元素的行也要更新。

你把数据结构和行标识搞得一团糟。我不太清楚每个数据框中的id引用是引用自己的数据框中的行,还是其他数据框中的行;ID不是按包含顺序排序的。当您创建联合数据框时,您已经递归地包含了一个列,以再次替换数据,使您的数据框在没有实际用途的情况下水平增长。

我认为你已经尝试过用自己的方式更新数据,现在你遇到了一些问题,如果你使用一种更常见的数据结构,你就不会遇到这些问题,而且已经被认为是可伸缩的和易于操作的。

  1. 如果您想要更新数据,最好的方法是使用一个数据模型,该数据模型在数据库中有一个格式正确的表(您仍然可以使用pandas;数据框可以是您的表)。您可以在更新请求到达要更新的内容是的位置时更新数据,而不是保留单独的更新记录,这些记录同时具有更新请求本身。这是非常混乱的。如果您希望保留更新的记录,则必须有一个不断更新的表,然后另一个表将每次already-executed操作的记录显示到表中。您可以将先前的值和更新的值存储在后者中。
  2. 您必须正确地命名您的数据框,并且当您引用另一个数据框中的ID时,该字段的名称必须固有地指示引用的是该数据框。
  3. 您可以在字段中包括日期,而不必引用另一个表。这看起来不太好。只需使用datetime.datetime模块并将对象转储到数据框中;Python也负责rest.
  4. Variable名称应该是不言而喻的:不使用rpbid,而是必须向每个人解释这意味着由to替换,只需使用replaced_by_id (注意下划线用于分隔单词)。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51937709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档