有条件地格式化 Python 熊猫单元格

Posted

技术标签:

【中文标题】有条件地格式化 Python 熊猫单元格【英文标题】:Conditionally format Python pandas cell 【发布时间】:2017-05-03 09:43:19 【问题描述】:

我正在尝试根据单元格的值对 Python pandas DataFrame 进行着色、突出显示或更改。例如如果每行上的单元格大于该行第一列中的单元格,则将该单元格突出显示为红色(或任何其他颜色),否则保持原样。

我在这里写了一个for循环:

for index in range(0, df.shape[0]):
    for column in range(1, df.shape[1]): # from 1 not from 0 because I only need # to compare the 2nd to the last cell of each row with the 1st cell in the row 

        if df.iloc[index][column] - df_BDE_n_months_avg_std_pct.iloc[index][0] > 0:
            then "PLEASE PUT YOUR HELP HERE, I NEED A PIECE OF CODE THAT CAN HIGHLIGHT THE CELL"
        else:
            "DO NOTHING"

到目前为止,我还没有找到方法。任何帮助都会很棒。

【问题讨论】:

【参考方案1】:

来自the style docs:

您可以应用条件格式,即 DataFrame 取决于其中的数据,使用 DataFrame.style 属性。

import pandas as pd
df = pd.DataFrame([[2,3,1], [3,2,2], [2,4,4]], columns=list("ABC"))

df.style.apply(lambda x: ["background: red" if v > x.iloc[0] else "" for v in x], axis = 1)


编辑:要格式化特定单元格,您可以添加条件检查器以使用 Series.iteritems() 检查元素名称或使用 enumerate() 检查索引,例如如果要从第 3 列开始格式化,可以使用 enumerate 并检查索引:

df = pd.DataFrame([[2,3,-3], [3,2,7], [2,4,4]], columns=list("ABC"))

df.style.apply(lambda x: ["background-color: #ff33aa" 
                          if (i >= 2 and (v > x.iloc[0] + x.iloc[1] 
                                          or v < x.iloc[0] - x.iloc[1])) 
                          else "" for i, v in enumerate(x)], axis = 1)

【讨论】:

感谢 Psidom!你的解决方案很棒!一个附加问题,那么如果我想为每一行设置规则,从第 3 个单元格 x,如果 x > 第 1 个单元格 + 第 2 个单元格,或 x 您可以enumerate 每行并检查索引,仅当索引为 >=2 时才修改单元格。查看更新。 再次感谢 Psidom。我还没有玩过熊猫,你的建议非常宝贵。感谢您的宝贵时间:) 嗨 Psidom,一个非常相似的问题。您是否知道如何在 matplotlib 条形图中有条件地为上述情况着色?假设我想在条形图中绘制数据框,但我只想将“-3”和“7”涂成红色,其余的将是白色或黑色。 如何应用到整行,例如我的数据框中有一个名为 total 的行多次,我该如何实现【参考方案2】:
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.rand(4,3))
df.style.applymap(lambda x: 'background-color : yellow' if x>df.iloc[0,0] else '')

【讨论】:

以上是关于有条件地格式化 Python 熊猫单元格的主要内容,如果未能解决你的问题,请参考以下文章

电子表格 - 基于其他单元格的条件格式单元格

excel条件格式中多个条件的公式帮助

如何有条件地设置 Dojo 数据网格中的单元格样式?

Excel 2016中的条件格式减去空白单元格

如果文本被另一个单元格匹配,请使用Google Apps脚本有条理地格式化一个单元格

如何有条件地格式化连续形式的文本框边框?