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

时间:2018-07-19 08:08:29

标签: python pandas if-statement

我有2个数据框,一个包含系统和版本的列表,另一个包含所有系统/版本的列表以及它们是否已过时,并且我正在努力执行某种类型的multi-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

我想做的是以下事情;

首先,我需要在obsolet_df中查找SIS_TYPE,然后我要检查EDITION是否匹配,但是如果EDITION中没有匹配,则应与星号匹配。找到与这两列都匹配的内容后,我要检查VERSION列中这三件事中的一个

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

如果满足所有这些条件,最后一步是将OBSOLETE值添加到system_df中。

所以期望的结果将是类似的

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

我尝试了.locmergejoin的许多组合,但无法获得所需的数据框。

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

        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 个答案:

答案 0 :(得分:1)

我认为应该像这样:

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

并没有所有需要的验证,但是添加验证很容易。抱歉,我没有测试!

答案 1 :(得分:0)

扩展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]