Python 将一个数据帧的样式设置结果复制到另一个数据帧

Python 将一个数据帧的样式设置结果复制到另一个数据帧,python,pandas,Python,Pandas,我有两个大小相同的数据帧,df_a和df_bdf_a仅包含数字,并使用颜色贴图(使用xlsxwriter或pandas样式)设置样式df_b包含混合值。是否可以将结果样式从一个数据帧复制到另一个数据帧,以便df_b[i,j]的背景色等于df_a[i,j] 在下面的示例中,df_b的第一个元素应该是红色,第二个元素应该是黄色,依此类推 df_a的格式化代码(基于xlsxwriter示例) 让我们使用Pandas的样式来格式化数据: # This will color every column i

我有两个大小相同的数据帧,
df_a
df_b
df_a
仅包含数字,并使用颜色贴图(使用xlsxwriter或pandas样式)设置样式
df_b
包含混合值。是否可以将结果样式从一个数据帧复制到另一个数据帧,以便
df_b[i,j]
的背景色等于
df_a[i,j]

在下面的示例中,
df_b
的第一个元素应该是红色,第二个元素应该是黄色,依此类推

df_a
的格式化代码(基于xlsxwriter示例)


让我们使用Pandas的
样式
来格式化数据:

# This will color every column into 3-category color
def style(df):
    s = {}
    for c1, c2 in zip(df.columns, df_a.columns):
        s[c1] = pd.cut(df_a[c2], bins=3, 
                          labels=[f'background-color:{c}' for c in ['red','blue','green']])
    return pd.DataFrame(s)


writer = pd.ExcelWriter(output_file)
df_a.style.apply(style, axis=None).to_excel(writer, sheet_name='df_a', index=False)
df_b.style.apply(style, axis=None).to_excel(writer, sheet_name='df_b', index=False)
writer.save()

此解决方案将接受的解决方案扩展到多个列,并使用颜色映射,而不是预定义的有限颜色集

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib

np.random.seed(24)
df_a = pd.DataFrame(10*np.random.randn(10, 4), columns=list('ABCD'))
df_b= pd.DataFrame(np.random.randn(10, 4), columns=list('ABCD'))

cm = sns.color_palette("Spectral", as_cmap=True)


def style(df):
    data = df_a.values
    data_normalized = (data - np.min(data)) / (np.max(data) - np.min(data))
    bg_colors = cm(data_normalized)
    bg_colors = np.apply_along_axis(matplotlib.colors.to_hex, 2, bg_colors)
    s = pd.DataFrame(bg_colors, columns=df.columns)
    for col in s.columns:
        s[col] = s[col].apply(lambda c: f'background-color:{c}')
    return s


writer = pd.ExcelWriter('temp.xlsx')
df_a.style.apply(style, axis=None).to_excel(writer, sheet_name='df_a', index=False)
df_b.style.apply(style, axis=None).to_excel(writer, sheet_name='df_b', index=False)
writer.save()
其结果如下:

是的,这是可能的,但我确实认为您应该在样式中包含代码
df_a
。我已经为xlsxwriter方法添加了一些代码,但我不受此限制。我在中没有看到任何允许您阅读工作簿格式的功能。我认为您需要存储条件格式的输出,保存它们,然后在需要重新应用它们时调用json或csv。谢谢。这不完全是我想要的,但这是我把问题简化了一点的错。然而,它确实激励我找到我需要的解决方案(见单独的答案)。既然你确实回答了我的问题,我就接受这个。
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib

np.random.seed(24)
df_a = pd.DataFrame(10*np.random.randn(10, 4), columns=list('ABCD'))
df_b= pd.DataFrame(np.random.randn(10, 4), columns=list('ABCD'))

cm = sns.color_palette("Spectral", as_cmap=True)


def style(df):
    data = df_a.values
    data_normalized = (data - np.min(data)) / (np.max(data) - np.min(data))
    bg_colors = cm(data_normalized)
    bg_colors = np.apply_along_axis(matplotlib.colors.to_hex, 2, bg_colors)
    s = pd.DataFrame(bg_colors, columns=df.columns)
    for col in s.columns:
        s[col] = s[col].apply(lambda c: f'background-color:{c}')
    return s


writer = pd.ExcelWriter('temp.xlsx')
df_a.style.apply(style, axis=None).to_excel(writer, sheet_name='df_a', index=False)
df_b.style.apply(style, axis=None).to_excel(writer, sheet_name='df_b', index=False)
writer.save()