如何在Pandas DataFrame中筛选行并对列表类型值条件着色
问题描述
现有如下Pandas DataFrame:
import pandas as pd import numpy as np d = {'Cell':['A','B','C','D','E'],'D1':[5, 2, 2, 6,6], 'D2':[np.nan, 5, 6, np.nan,3], 'D3':[7,np.nan, 5, 5,np.nan], 'D6':[17, 3, np.nan,np.nan,2],'diff%':[np.nan,[40],[16.67],[16.67,50],[50,33,24]]} df = pd.DataFrame(d)
对应的表格输出:
| Cell | D1 | D2 | D3 | D6 | diff% |
|---|---|---|---|---|---|
| A | 5 | NaN | 7.0 | 17.0 | NaN |
| B | 2 | 5.0 | NaN | 3.0 | [40] |
| C | 2 | 6.0 | 5.0 | NaN | [16.67] |
| D | 6 | NaN | 5.0 | NaN | [16.67, 50] |
| E | 6 | 3.0 | NaN | 2.0 | [50, 33, 24] |
需要完成两个需求:
- 生成新DataFrame,仅保留
diff%列中存在大于30的元素的行; - 为
diff%列中大于30的元素添加红色加粗的条件样式,用于生成HTML表格。
期望输出的DataFrame:
| Cell | D1 | D2 | D3 | D6 | diff% |
|---|---|---|---|---|---|
| B | 2 | 5.0 | NaN | 3.0 | [40] |
| D | 6 | NaN | 5.0 | NaN | [16.67, 50] |
| E | 6 | 3.0 | NaN | 2.0 | [50, 33, 24] |
解决方案
1. 筛选符合条件的行
通过apply函数检查diff%列的每个元素,排除NaN行后,判断列表中是否存在大于30的值,以此过滤行:
# 生成筛选掩码:仅保留diff%为列表且包含>30元素的行 mask = df['diff%'].apply(lambda x: any(num > 30 for num in x) if isinstance(x, list) else False) filtered_df = df[mask].reset_index(drop=True)
执行后filtered_df即为符合要求的筛选结果。
2. 添加条件样式并生成HTML表格
自定义样式函数,对diff%列中大于30的元素嵌入HTML样式标签,再通过Pandas的style对象生成可直接使用的HTML表格:
def style_diff_percent(val): if not isinstance(val, list): return str(val) # 遍历列表元素,为>30的数值添加红色加粗样式 styled_items = [] for num in val: if num > 30: styled_items.append(f'<span style="color:red; font-weight:bold;">{num}</span>') else: styled_items.append(str(num)) return f"[{', '.join(styled_items)}]" # 应用样式到diff%列 styled_df = filtered_df.style.format({'diff%': style_diff_percent}) # 导出为HTML表格(escape=False确保样式标签不被转义) html_table = styled_df.to_html(escape=False)
生成的html_table可直接保存为.html文件或嵌入网页,大于30的数值会显示为红色加粗效果。
内容的提问来源于stack exchange,提问作者sandeep
相关产品推荐
相关产品推荐

