使用Pandas style.applymap()给列单元格上色时遇'int'无index属性错误
问题原因与解决方案
错误根源
你触发的AttributeError: 'int' object has no attribute 'index',核心原因是误用了applymap()方法:applymap()是逐单元格执行函数的,传给highlight_col的参数x是单个单元格的值(比如10、"Rahul"这类),而不是整个DataFrame或Series,自然没有index属性。
另外你的代码还有两个隐性问题:
- 切片逻辑错误:
df.iloc[i:1, 0]当i>0时是空区间,根本定位不到目标行 - 索引越界:
lst里的5超出了df1的行索引范围(df1只有0-4共5行)
修正方案
根据你的需求——给指定列的部分行(按行索引列表)设置红色,应该使用style.apply()(按行/列/整个DataFrame处理),以下是两种可行写法:
方案1:针对整个DataFrame设置指定列样式
def highlight_col(df, lst, col_idx=0): # 初始化样式DataFrame,默认无样式 style_df = pd.DataFrame('', index=df.index, columns=df.columns) # 遍历目标行索引,给指定列设置红色 for i in lst: if i < len(df): # 避免索引越界 style_df.iloc[i, col_idx] = 'color: red' return style_df df1 = pd.DataFrame({'id':[10,11,12,13,14], 'name':['Rahul', 'Ravi', 'Mike', 'Nair', 'Mona'], 'age':[30,40,23,45,12], 'street_no':['E112', 'B115', 'C119', 'H112', 'J091']}) lst = (1, 3) # 去掉超出范围的索引5 style1 = df1.style.apply(highlight_col, lst=lst, col_idx=0, axis=None) style1
axis=None让函数接收整个DataFrame作为参数- 直接用
iloc[i, col_idx]精准定位目标单元格 - 增加索引越界判断,避免无效索引报错
方案2:仅针对指定列设置样式
如果只需要给某一列(比如id列)设置样式,可以更简洁:
def highlight_col(series, lst): style = ['']*len(series) for i in lst: if i < len(series): style[i] = 'color: red' return style df1 = pd.DataFrame({'id':[10,11,12,13,14], 'name':['Rahul', 'Ravi', 'Mike', 'Nair', 'Mona'], 'age':[30,40,23,45,12], 'street_no':['E112', 'B115', 'C119', 'H112', 'J091']}) lst = (1, 3) style1 = df1.style.apply(highlight_col, lst=lst, subset=['id']) style1
- 通过
subset=['id']指定仅对该列应用样式 - 函数接收该列的Series,返回对应长度的样式列表
内容的提问来源于stack exchange,提问作者Rafi Ansari
相关产品推荐
相关产品推荐

