根据 pandas 数据帧范围格式化单元格

Format cells based on pandas dataframe range

我有两个 pandas 数据框,如下所示。我想将第二个数据框 (df2) 中所有行的字体颜色更改为红色(代码应该采用数据框范围而不是 A7:A8,因为范围可能会根据数据框上升或下降)

import pandas as pd

df1 = pd.DataFrame({'Data1': [10, 20, 30],
                   'Data2': [11, 21, 31],
                   'Date': [pd.to_datetime('today'), 
                            "", 
                            pd.to_datetime('today')]})
df2 = pd.DataFrame({'Data1': ["A", "B"]})

writer = pd.ExcelWriter('pandas_filter.xlsx', engine='xlsxwriter', )
workbook  = writer.book

df1.to_excel(writer, sheet_name='Sheet1', index=False)
df2.to_excel(writer, sheet_name='Sheet1', index=False, startrow=df1.shape[0]+2 , startcol=0)
writer.save()

我期待如下屏幕截图所示的输出

下面的代码似乎不起作用:

import pandas as pd

df1 = pd.DataFrame({'Data1': [10, 20, 30],
                   'Data2': [11, 21, 31],
                   'Date': [pd.to_datetime('today'), 
                            "", 
                            pd.to_datetime('today')]})
df2 = pd.DataFrame({'Data1': ["A", "B"]})

writer = pd.ExcelWriter('pandas_filter.xlsx', engine='xlsxwriter', )
workbook  = writer.book

df1.to_excel(writer, sheet_name='Sheet1', index=False)
df2.to_excel(writer, sheet_name='Sheet1', index=False, startrow=df1.shape[0]+2 , startcol=0)

def to_red():
    return 'color: red'

df2.style.applymap(to_red)

writer.save()

您需要在定义的函数中传递一个参数,并且您必须 re-assign 将样式对象返回给 df2。

尝试:

df1 = pd.DataFrame({'Data1': [10, 20, 30],
                   'Data2': [11, 21, 31],
                   'Date': [pd.to_datetime('today'), 
                            "", 
                            pd.to_datetime('today')]})
df2 = pd.DataFrame({'Data1': ["A", "B"]})

writer = pd.ExcelWriter('pandas_filter.xlsx', engine='xlsxwriter', )
workbook  = writer.book


#Note change in following line
def to_red(val):
    return 'color: red'

df2 = df2.style.applymap(to_red)
#Note move write lines after saving stying to df2 variable again.
df1.to_excel(writer, sheet_name='Sheet1', index=False)
df2.to_excel(writer, sheet_name='Sheet1', index=False, startrow=df1.shape[0]+2 , startcol=0)

writer.save()

输出: