如何设置Pandas DataFrame左上角单元格的样式

wwwo4jvm  于 2022-09-21  发布在  其他
关注(0)|答案(2)|浏览(362)

我知道要访问 Dataframe 的左上角单元格,我们需要使用df.columns.name,我可以看到有关样式的PANAS文档提供了使用apply_index(https://pandas.pydata.org/docs/user_guide/style.html)设置行/列标题样式的示例

我的问题是如何设置左上角单元格的样式,比如将其设置为蓝色。谢谢。

import pandas as pd
d = {'col1': [1, 2], 'col2': [3, 4]}
df = pd.DataFrame(data=d)
df.columns.name = 'Test'
df

更新:下面是Oroboros1的答案,内容非常丰富,也很有帮助。但似乎在将Styler对象转换为Excel时,即转换为_EXCEL()时,左上角单元格的格式不会保留。

在文档(和导出到Excel部分)中,声明“导出到Excel中不包括表级样式和数据单元格css类:单个单元格必须具有由Styler.apply和/或Styler.applymap方法Map的属性”。

更新:多亏了@ouroboros1,对于任何感兴趣的人来说,这里都是一个可能的解决方案。

d = {'col1': [1, 2], 'col2': [3, 4]}
color_matrix_df = pd.DataFrame([['background-color:yellow', 'background-color:yellow'],
                ['background-color:yellow', 'background-color:blue']])
df = pd.DataFrame(data=d)
df.columns.name = 'Test'
df

def colors(df, color_matrix_df):
    style_df = pd.DataFrame(color_matrix_df.values, index=df.index, columns=df.columns)
    return style_df.applymap(lambda elem: elem)

df_upper_left_cell = df.style.set_table_styles(
    [{'selector': '.index_name',
      'props': [('background-color', 'IndianRed'),
                ('color', 'white')]
     }]
)

df_upper_left_cell.apply(colors, axis=None, color_matrix_df=color_matrix_df)

w = pd.ExcelWriter('Test.xlsx', engine='xlsxwriter')
df_upper_left_cell.to_excel(w, index=True)
wb = w.book
ws = w.sheets['Sheet1']
fmt_header = wb.add_format({'fg_color': '#cd5c5c', 'align': 'center'})
ws.write(0,0, df_upper_left_cell.data.columns.name, fmt_header)
w.save()

上述代码将对数据框进行如下所示的着色,并将其保存到Excel文件。

6pp0gazn

6pp0gazn1#

为此,您可以使用Styler.set_table_styles

我们有以下选项:

  • 左上角(下称“cell”)为空(未设置name)
  • 单元格包含df.columns.name和/或df.index.name

有三个选项可以设置单元格的样式(全部或部分)。我会在下面走一遍。首先是数据:

import pandas as pd
df = pd.DataFrame({'col1': [1, 2], 'col2': [3, 4]})
df

标准外观:

**选项1.**单元格为空

诀窍是查看print(df.style.set_table_styles().to_html())的输出:

<thead>
    <tr>
      <th class="blank level0" >&nbsp;</th>
      <th id="T_d7719_level0_col0" class="col_heading level0 col0" >col1</th>
      ...
    </tr>
  </thead>

注意:<th class="blank level0" >&nbsp;</th>。我们可以访问这些类名并设置格式。例如,在这种情况下,我们访问blank(level0应用于所有level0,即也应用于所有COLS和索引)。

df.style.set_table_styles(
    [{'selector': '.blank',
      'props': [('background-color', 'IndianRed'),
                ('color', 'white')]
     }]
)

结果:

选项2.df.columns.name和/或df.index.name。一种样式到整个单元格。

在这两种情况下,我们都需要.index_name,而不是.blank。例如。

df.columns.name = 'columns'

df.style.set_table_styles(
    [{'selector': '.index_name',
      'props': [('background-color', 'IndianRed'),
                ('color', 'white')]
     }]
)

结果:

选项3.df.columns.namedf.index.name,风格不同。

这个比较复杂,因为我们需要为columns.name添加tr:nth-child(1),为index.name添加tr:nth-child(2)


# just setting col and index name immediately inside `pd.DataFrame`

df = pd.DataFrame([[1,3],[2,4]], 
                  columns=pd.Index(['col1','col2'], name='columns'), 
                  index=pd.Index([0,1], name='index'))

df.style.set_table_styles(
    [{'selector': 'tr:nth-child(1) .index_name',
      'props': [('background-color', 'IndianRed'),
                ('color', 'white')]
     }, {'selector': 'tr:nth-child(2) .index_name',
      'props': [('background-color', '#EECACA'),
                ('color', 'black')]
     }]
)
3vpjnl9f

3vpjnl9f2#

基于The Coding Bot: How to colour a specific cell in pandas dataframe based on its position?

您可以将style.applyiloc一起用于特定单元格来分配颜色。

def styling_specific_cell(x,row_idx,col_idx):
    #color = 'background-color: lightblue; color: blue'
    #color = 'color: blue'
    color = 'background-color: lightblue'
    df_styler = pd.DataFrame('', index=x.index, columns=x.columns)
    df_styler.iloc[row_idx, col_idx] = color
    return df_styler

style_idx_row = 0  
style_idx_column = 0   

df.style.apply(styling_specific_cell, row_idx = style_idx_row, col_idx = style_idx_column,
               axis = None)

将函数中的#更改为字体颜色或两者都更改。

要查看函数中的步骤,请检查:

print(pd.DataFrame('', index=df.index, columns=df.columns))
print(df.iloc[0,0])

要将颜色关联到特定索引,可以使用style.applymap_index

def color_b(v):
    return "background-color: lightblue;" if v == 0 else None

df.style.applymap_index(color_b)

相关问题