首页 > 解决方案 > Pandas:获取由 pandas.DataFrame.update 更新的单元格

问题描述

我正在使用pandas.DataFrame.update合并两个数据框,例如

import pandas as pd

df1 = pd.DataFrame(
    {'ID': [101, 102, 103],
     'A': ['..', '..', '..'],
     'B': ['..', '..', '..'], 
}).set_index('ID')

df2 = pd.DataFrame(
    {'ID': [101, 102, 223],
     'A': ['..', '..', '..'],
     'B': ['..', 'XY', '..'],
}).set_index('ID')

df1.update(df2)

如何获取单元格(在本例中为 ID 102 的 B 列)例如应用一些格式?我的目标是用黄色背景标记所有已更新的单元格。

谢谢你的支持。

标签: pythonpandasdataframe

解决方案


想法是将原始df11DataFrame 与自定义函数中的更新进行比较并传递给Styler.apply

df1 = pd.DataFrame(
    {'ID': [101, 102, 103],
     'A': ['..', '..', '..'],
     'B': ['..', '..', '..'], 
}).set_index('ID')

df2 = pd.DataFrame(
    {'ID': [101, 102, 223],
     'A': ['..', '..', '..'],
     'B': ['..', 'XY', '..'],
}).set_index('ID')


df11 = df1.reset_index().copy()
df1.update(df2)


def highlight(x):
    c1 = 'background-color: yellow'

    df3 = pd.DataFrame('', index=x.index, columns=x.columns)
    df3 = df3.mask(df11.ne(x), c1)
    return df3

df1.reset_index().style.apply(highlight, axis=None).to_excel('file.xlsx', index=False)

推荐阅读