我使用的是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中。rfbid
和rpbid
用于replacedbyid
和replacementforid
,因此生成的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
是否为空,如果不是,我在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',这意味着它是该给定订单的第一条记录。
发布于 2018-08-21 04:45:15
免责声明:与其试图找出问题的根源来获得您想要的数据框架,我这个答案的目的是确保您完全确定您正在做什么,并可能帮助您更好地组织您的数据。
就我所见,您有两个数据框,每个数据框中都有相互的绑定来更新它们的内容;问题是您正在展示一个示例,其中要更新另一个数据框中的另一个元素的行也要更新。
你把数据结构和行标识搞得一团糟。我不太清楚每个数据框中的id引用是引用自己的数据框中的行,还是其他数据框中的行;ID不是按包含顺序排序的。当您创建联合数据框时,您已经递归地包含了一个列,以再次替换数据,使您的数据框在没有实际用途的情况下水平增长。
我认为你已经尝试过用自己的方式更新数据,现在你遇到了一些问题,如果你使用一种更常见的数据结构,你就不会遇到这些问题,而且已经被认为是可伸缩的和易于操作的。
datetime.datetime
模块并将对象转储到数据框中;Python也负责rest.rpbid
,而是必须向每个人解释这意味着由to替换,只需使用replaced_by_id
(注意下划线用于分隔单词)。https://stackoverflow.com/questions/51937709
复制相似问题