代码之家  ›  专栏  ›  技术社区  ›  Nordle

多个if语句比较两个数据帧并基于结果填充数据帧

  •  0
  • Nordle  · 技术社区  · 6 年前

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

    我要做的是:;

    首先我需要查找 SIS_TYPE 在废弃数据框中,我想检查 EDITION 但如果没有匹配 版本 它应该与星号匹配。在找到这两列的匹配项之后,我想检查 VERSION 这三件事中的一件;

    • 直接匹配
    • 使用正则表达式比较第一个数字(9.1=9)的部分匹配
    • 如果以上都没有,则检查下一个最高版本的值(检查9与10、11等)

    最后一步是添加 OBSOLETE 如果满足所有这些条件,则输入系统的值。

    因此,期望的结果是这样的;

    >>> 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 我是说, merge join 但我无法得到我需要的数据帧。

    编辑:我已经尝试了以下操作,但是对于实际数据帧中的条目数量来说太慢了:

            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]))
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   greg    6 年前

    我觉得应该是:

    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], ...))
    

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

        2
  •  0
  •   Nordle    6 年前

    扩展greg的答案,在两个表的行之间循环并直接比较这些值似乎工作得很好。使用的最终代码;

    #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]