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