如何从第二行起为符合df.shape条件的单元格填充#A9D08E背景色?
修正后的代码及问题说明
原代码的核心问题
- 无效条件:
val == df.shape永远不会成立,因为df.shape返回的是(总行数, 总列数)的元组,单元格的单个数值不可能与元组相等。 - 条件过宽:
val >=1会匹配所有大于等于1的数值,导致大量非目标单元格被染色。 - 未限制行范围:没有排除第一行,所有行都会被处理。
针对对角线染色(参考效果)的修正代码
如果你的需求是从第二行开始,为**值等于所在行号/列号(从1开始计数)**的单元格染色(对应参考图的对角线效果),可以用以下代码:
import pandas as pd df = pd.read_excel(r'C:\Users\Beexprss\Desktop\python\ar.xlsx') def color_cells(df): # 创建空样式矩阵,初始无样式 style_matrix = pd.DataFrame('', index=df.index, columns=df.columns) # 遍历第二行及以后的所有行 for row_idx in df.index[1:]: for col in df.columns: # 转换为从1开始的行号、列号 row_num = row_idx + 1 col_num = df.columns.get_loc(col) + 1 # 判断值是否等于行号或列号 if df.loc[row_idx, col] == row_num or df.loc[row_idx, col] == col_num: style_matrix.loc[row_idx, col] = 'background-color: #A9D08E' return style_matrix # 应用样式,axis=None表示传入整个数据框 styled_df = df.style.apply(color_cells, axis=None) styled_df
针对df.shape相关条件的修正代码
如果你的需求是从第二行开始,为值等于总行数或总列数的单元格染色(符合df.shape相关条件),只需修改判断条件:
import pandas as pd df = pd.read_excel(r'C:\Users\Beexprss\Desktop\python\ar.xlsx') def color_cells(df): style_matrix = pd.DataFrame('', index=df.index, columns=df.columns) total_rows, total_cols = df.shape for row_idx in df.index[1:]: for col in df.columns: # 判断值是否等于总行数或总列数 if df.loc[row_idx, col] == total_rows or df.loc[row_idx, col] == total_cols: style_matrix.loc[row_idx, col] = 'background-color: #A9D08E' return style_matrix styled_df = df.style.apply(color_cells, axis=None) styled_df
关键说明
- 使用
style.apply而非applymap:因为需要获取单元格的行/列位置信息,applymap只能获取单元格的值,无法满足行范围限制的需求。 axis=None:让样式函数接收整个数据框,方便遍历所有单元格的位置和值。
内容的提问来源于stack exchange,提问作者Nay Zaw
相关产品推荐
相关产品推荐

