基于Condition的Python递归更新

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (41)

我正在使用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

我的想法是,我想处理2个案例:1。封闭记录是该实例的第一个和最后一个记录(id 3in df1),2。其中封闭记录在df2中有一个更新的记录链接。 rfbid并且rpbid为了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

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

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

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)

更多背景; 如果被替换的ID为空且状态为“已更新”,则表示它是该给定订单的第一个记录。

提问于
用户回答回答于

免责声明:我没有试图找到问题的底部来获得你想要的数据框架,而是用这个答案的意图是确保你完全确定你在做什么,也许可以帮助你构建你的数据好一点。

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

您正在弄乱数据结构和行标识。我不清楚每个数据帧中的id引用是指它们自己的数据帧中的行还是其他行中的行引用; ID不按包含顺序排序。在创建联合数据框时,您已经递归地包含了一列仍然可以再次替换数据,使您的数据框水平增长而没有实际用途。

我认为你已经尝试以自己的方式更新数据,现在你遇到了一些问题,如果你使用的数据结构比较常见并且已经考虑过可扩展且易于操作,那么你本来就不会遇到这些问题。

  1. 如果要更新数据,最好的方法是使用数据库中正确格式化的数据模型(您仍然可以使用pandas;数据框可以是您的表)。当更新请求到达要更新内容的位置时,您可以更新数据,而不是保留单独的更新记录,同时本身也有更新请求。那太乱了。如果要保留更新记录,则必须有一个不断更新的表,然后是另一个表,该表显示每个已执行的操作记录到表中。您可以在后者中存储先前的值及其更新的值。
  2. 您必须正确命名数据框,并且当您在另一个数据框中引用ID时,该字段的名称必须固有地指示引用是该数据框。
  3. 您可以在字段中包含日期,您不必引用另一个表。这看起来不太好。只需使用datetime.datetime模块并将对象转储到数据框中; Python负责其余部分。
  4. 变量名也应该是不言自明的:不是使用rpbid,而是必须向每个人解释意味着被替换为,只需使用replaced_by_id(注意下划线来分隔单词)。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励