[英]Highlight a row in a pandas df if that row also appears in another df
我有两个数据帧 df1 和 df2。 我想用黄色突出显示 df1 中也存在于 df2 中的所有行。
到目前为止,我只找到了插入另一行并在那里使用变量来标识我必须为哪一行着色的解决方案。
我的问题是下面介绍的function中是否可以直接比较这两个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)
正如我所说,如果我事先进行比较,插入另一列并在其中放置一个变量,然后我可以搜索该变量并突出显示该行。 我的问题是我是否也可以直接在 function 中执行此操作。为此,我必须能够比较 function 中的两个 df。这可能吗? 能够比较单行就足够了,例如 with.isin
与 function 内部的df2
相比效率低下。
您可以定义一个临时列以使用合并来标识匹配项(指示列in_1
变为left_only
或both
取决于df2
中是否存在该行)。 然后它被样式器忽略:
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))
或者,要在 function 中实际进行比较,请预先定义一组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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.