突出显示Pandasdf中的一行(如果该行也出现在另一个df中)

e4yzc0pl  于 2023-01-11  发布在  其他
关注(0)|答案(1)|浏览(101)

我有两个 Dataframe df1和df2。我想用黄色突出显示df1中同时存在于df2中的所有行。
df1
df2
What I want to achive
到目前为止,我只找到了这样的解决方案:插入另一行,并在其中使用一个变量来标识要着色的行。
我的问题是是否可以在下面的函数中直接比较这两个df。
这是两个df:

df1 = pd.DataFrame([['AA',3,'hgend',1], ['BB','frdf',7,2], ['C1',4,'asef',4], ['C2',4,'asef',4], ['C3',4,'asef',4]], columns=list("ABCD"))
df2 = pd.DataFrame([['C1',4,'asef',4], ['C2',4,'asef',4], ['C3',4,'asef',4]], columns=list("XYZQ"))

这是我的代码着色行:

def highlight_rows(row):
    value = row.loc['A']
    if value == 'C1':
        color = 'yellow'
    else:
        color = ''
    return ['background-color: {}'.format(color) for r in row]

df1.style.apply(highlight_rows, axis=1)

正如我所说的,如果我事先做比较,插入另一列并在那里放置一个变量,我就可以搜索这个变量并突出显示该行。我的问题是我是否也可以直接在函数中做这件事。要做到这一点,我必须能够在函数中比较两个df。这可能吗?能够比较单行就足够了,例如,与.isin

ql3eal8s

ql3eal8s1#

与函数内部的df2相比,效率很低。
您可以定义一个临时列来使用合并来标识匹配项(指示符列in_1将变为left_onlyboth,具体取决于该行是否存在于df2中),然后它将被styler忽略:

def highlight_rows(row):
    highlight = 'yellow' if row['in_1'] == "both" else ""
    return ['background-color: {}'.format(highlight) for r in row]

(pd.merge(df1, df2.set_axis(df1.columns.tolist(), axis=1), 
          how="left", indicator="in_1")
    .style
    .hide_columns(['in_1'])
    .apply(highlight_rows, axis=1))

或者,要在函数内部实际执行比较,请预先定义一组df2行的元组:

set_df2 = set(df2.apply(tuple, axis=1))

def highlight_rows(row):
    color = 'yellow' if tuple(row) in set_df2 else ""
    return [f'background-color: {color}'] * len(row)

df1.style.apply(highlight_rows, axis=1)

相关问题