我有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
列中这三件事中的一个;
如果满足所有这些条件,最后一步是将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
我尝试了.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]))
答案 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]