合并数据框,其中列具有默认值并覆盖

时间:2018-08-13 02:52:51

标签: python pandas dataframe

我有一个Pandas数据框,其中列出了各种系统的阈值:

      METRIC  SYSTEM_NAME  YELLOW      RED
16    pagins          NaN   500.0   1000.0
17  preadsec          NaN  5000.0  10000.0
18   swapins          NaN   250.0    500.0
19  cpupcent          foo   30.0     90.0
20    pagins          bar   456.0    123.0

我想将此df合并到另一个包含这些指标的样本中。阈值作为一组默认值包含在配置中,每个默认值均具有每个系统的覆盖范围,就像上面的第16和20行一样。

我希望这能反映在结果联接中-如果存在覆盖,它应该优先于默认联接-但是,我只能通过执行2个合并操作来看到此工作-一个代表默认联接,另一个覆盖-然后用三分之一生成最终表。

我相信在SQL中我可以使用OR子句来做到这一点,但是我找不到在Pandas中做到这一点的方法。

这样的东西存在吗?

编辑:为清楚起见,另一个DF具有以下结构:

              SYSTEM_NAME    METRIC        CVAL
19886                 foo  cpupcent   89.281734
19887                 bar   swapins   41.799927
19888                 bar    pagins   123.92355
19889                quux  preadsec   28.837423
19890                quux    pagins   232.30303

因此,在假设的合并中,结果输出将如下所示:

              SYSTEM_NAME    METRIC        CVAL   YELLOW      RED
19886                 foo  cpupcent   89.281734     30.0     90.0
19887                 bar   swapins   41.799927    250.0    500.0
19888                 bar    pagins   123.92355    456.0    123.0
19889                quux  preadsec   28.837423   5000.0  10000.0 
19890                quux    pagins   232.30303    500.0   1000.0

此处,bar的分页已被覆盖,而quux已将YELLOW和RED的默认值设为默认值。由于替代仅适用于分页,因此bar的交换是默认设置。

1 个答案:

答案 0 :(得分:0)

经过不断的摸索,我发现了这个。它有点令人费解和混乱,但可以在合理的时间内解决该问题。

假定这些值由另外一列加权,而最低值优先。

# Ground work, prepare the index
tmp_df = df.reset_index()
# Now, perform the merge. Use the common value, then tidy up the duplicates
tmp_df = tmp_df.merge(t_df, 'left', on='METRIC')\
         .drop('SYSTEM_NAME_y', axis=1)
         .rename(index=str, columns='SYSTEM_NAME_x':'SYSTEM_NAME'})
         .drop_duplicates(subset=['END_DATE','METRIC','SYSTEM_NAME'], keep='last')
# And restore the index
tmp_df = tmp_df.set_index(df.index.name)