Python 多个IF语句比较2个数据帧并基于结果填充数据帧

Python 多个IF语句比较2个数据帧并基于结果填充数据帧,python,pandas,if-statement,Python,Pandas,If Statement,我有两个数据帧,一个是系统和版本的列表,另一个是所有系统/版本的列表,以及它们是否过时,我正在努力执行某种多if语句(包括比较器),并用第二个df中的数据填充第一个df中的数据 数据帧是 >>> system_df ID SIS_TYPE EDITION VERSION 0 SYS1 AMA first 2 1 SYS2 DIR first 10.3 2 SYS3 DIR

我有两个数据帧,一个是系统和版本的列表,另一个是所有系统/版本的列表,以及它们是否过时,我正在努力执行某种多if语句(包括比较器),并用第二个df中的数据填充第一个df中的数据

数据帧是

>>> system_df
    ID    SIS_TYPE   EDITION   VERSION
0   SYS1      AMA     first       2
1   SYS2      DIR     first       10.3
2   SYS3      DIR     second      9
3   SYS4      ORA     first       7




>>> obsolete_df
    SIS_TYPE   EDITION   VERSION    OBSOLETE
0      AMA     first      2          YES
1      DIR     first      10         NO
2      DIR       *        9.1        NO
3      ORA     third      7          YES
4      ORA       *        9          NO
5      ORA       *        8          YES
我想做的是:

首先,我需要在obsolet_df中查找
SIS_类型
,然后我想检查
EDITION
是否匹配,但如果
EDITION
中没有匹配,它应该与星号匹配。在找到与这两个列的匹配项后,我想检查
版本
列中的这三项内容之一

  • 直接匹配
  • 使用正则表达式比较第一个数字(9.1=9)的部分匹配
  • 如果以上都没有,则检查下一个最高版本的值(对照10、11等检查9)
最后一步是在满足所有这些条件的情况下,将
过时的
值添加到系统中

因此,期望的结果是:

>>> final_df
    ID    SIS_TYPE   EDITION   VERSION    OBSOLETE
0   SYS1      AMA     first      2          YES
1   SYS2      DIR     first      10         NO
2   SYS3      DIR       *        9.1        NO
3   SYS4      ORA     third      8          YES
我尝试了许多组合
.loc
合并
加入
但我无法获得所需的数据帧

编辑:我尝试了以下方法,但是对于真实数据帧中的条目数量来说,速度太慢了:

        l = []
        for s_row in system_df.itertuples():
            for o_row in obsolete_df.loc[obsolete_df['SUBSYSTEM_TYPE'] == s_row[26]].itertuples():
                if s_row[28] == o_row[2]:
                    l.append((s_row[28], s_row[2]))
                elif o_row[2] == '*':
                    l.append((s_row[28], s_row[2]))

我认为应该是这样的:

l = []
for i in range(len(obsolete_df)):
    s_row = system_df[i]
    o_row = obsolete_df[i]
    if s_row[2] == o_row[1]: # compare SIS_TYPE
        if s_row[2] == o_row[1] or o_row[1] == '*': # compare EDITION
            l.append((s_row[1], s_row[2], ...))

它并没有所有需要的验证,但添加它们会很容易。对不起,我没有测试它

扩展格雷格的答案,遍历两个表的行并直接比较值似乎效果不错。使用的最终代码

#Iterating through each row in system_df
for s_row in system_df.itertuples():
        #Iterating through each row in obsolete_df if the SIS_TYPE matches
        for o_row in obsolete_df.loc[obsolete_df['SIS_TYPE'] == s_row[2]].itertuples():

            #Comparing Editions and Versions
            if s_row[3] == o_row[2] and s_row[4] == o_row[3]:
                #Updating the system_df with new values if match
                system_df.at[s_row.Index, 'OBSOLETE'] = o_row[4]

            #Else if use'*' for Edition and compare Versions
            elif o_row[2] == '*' and s_row[4] == o_row[3]:
                system_df.at[s_row.Index, 'OBSOLETE'] = o_row[4]

没问题,谢谢!我真的需要一个开始的地方,我会玩这个,看看我如何尝试以下
l=[]
用于self.final_df.itertuples():
用于self.ocated_dataframe.loc[self.ocated_dataframe['SUBSYSTEM_TYPE']=
用于self.final_df.itertuples():
如果self.28==o_行[2]:((s_行[28],s_行[2]))
elif o_行[2]='*':
l.append((s_行[28],s_行[2]))
但是这花了很长很长的时间,df大约有30万条条目,因此必须搜索更优化的条目。谢谢你的建议!谢谢Greg,我已经将你的建议作为起点进行了研究,效果很好。如果你感兴趣,我已经发布了我自己的答案作为参考。你在system_df中有4条条目。为什么o您在final_df?中有5行。如果您想要合并系统_df和过时的_df,那么final_df应该有5行以上……为什么在过时的_df中有索引4的两行?@joaquin,因为过时的_df包含重复信息(在SIS_类型级别上)这是我的原则,它更多的是一个条件查找,而不是一个合并。行索引是一个错误,我已经纠正了。我说的不是列,而是行。相对于system_df(SYS5),它是否只向最终_df添加了一行合并后?ORA vs 9在Observed_df中的情况如何?只是想了解您想要的实际结果是什么对不起,这是我的一个输入错误。如果通过列
SIS_TYPE
EDITION进行条件查找,则不应添加行,只需在系统_df中填充新列
Observed
版本