具有不同条件的多个列的 Pandas 条件格式

Pandas conditional formatting on multiple columns with different criteria

提问人:Jay Cheng 提问时间:1/6/2023 最后编辑:TimelessJay Cheng 更新时间:9/22/2023 访问量:413

问:

我想根据其列有条件地格式化具有多个条件的 df,如下所示:

business_entity 2021-H1 2022-H1 2022-H2 运动
2 美国广播公司 0 0 100 100
4 DEF的 99 99 100 1
8 GHI指数 97 97 98 1
20 IKO公司 98 98 98 0
3 移动网络运营商 98 97 98 1
23 PQR码 0 0 98 98
19 VT0型 98 97 98 1
22 VWX系列 96 98 98 0
17 DFD公司 97 99 98 -1

我正在尝试做的是使用以下条件格式化 df:

对于 2021-H1 到 2022-H2 的列: 如果值 >= 89(绿色),如果值 >=79.5 和 <89(橙色),如果值 <79.5(红色)

对于“运动”列: 如果值 >=.05(绿色),值 >-.05 和 <.05(橙色),值 <=-.05(红色)

我在这里做了一些研究,并提出了以下代码:

division_summary_table.style.apply(
    lambda x: ['background:green'
          if (colname=='2021-H1' and value >=89)
          else 'background:orange'
          if (colname=='2021-H1' and value >=79.5)
          else 'background:red'
          if (colname=='2021-H1' and value <79.5)
          else 'background:green'
          if (colname=='2022-H1' and value >=89)
          else 'background:orange'
          if (colname=='2022-H1' and value >=79.5)
          else 'background:red'
          if (colname=='2022-H1' and value <79.5)
          else 'background:green'
          if (colname=='2022-H2' and value >=89)
          else 'background:orange'
          if (colname=='2022-H2' and value >=79.5)
          else 'background:red'
          if (colname=='2022-H2' and value <79.5)
          else 'background:green'
          if (colname=='Movement' and value >=.5)
          else 'background:orange'
          if (colname=='Movement' and value >=0)
          else 'background:red'
          if (colname=='Movement' and value <-.5)
          else ' '
          for colname, value in x.items()],axis=1).format(precision=0)

它现在工作正常,但真的很“冗长”。由于我需要生成多个这样的表格并应用相同的格式,因此我尝试编写一个简单的函数,然后稍后重用它:

def styler(df):
    for colname, value in df.items():

        if (colname=='2021-H1' and value >=89):
            return 'background:green'
        elif (colname=='2021-H1' and value >=79.5):
            return 'background:orange'
        elif (colname=='2021-H1' and value <79.5):
            return 'background:red'
        else:
            return ''


division_summary_table.apply(styler)

当我应用它时,它给了我以下错误:

“0x000002566633C940> 的函数<功能样式器导致了 将方法折叠到序列”。通常,这是以下结果 该函数返回单个值,而不是类似列表的值。

我是初学者,真的不知道如何解决它。感谢您对实现我想要实现的目标的更好方法的建议。我需要帮助的另一件事是如何将表格保存为带有条件格式的 png 文件。

Python DataFrame 条件格式 pandas 样式

评论

0赞 starball 1/12/2023
你能整理一下你的代码的缩进吗?对于这里的帮助者来说,整齐地展示你的代码以提高可读性是基本的礼貌。另请参阅我应该在我的帖子和标题中保留哪些内容?

答:

1赞 Shubham Sharma 1/6/2023 #1

让我们定义列子集的函数:colorize

def colorize_year(v):
    return np.select(
        [v >= 89, (v < 89) & (v >= 79.5), v < 79.5],
        ['background: green', 'background: orange', 'background: red']
    )

def colorize_movement(v):
    return np.select(
        [v >= .05, (v < .05) & (v >= -.05), v <= -.05],
        ['background: green', 'background: orange', 'background: red']
    )

(
    df.style
    .apply(colorize_movement, subset=['Movement'])
    .apply(colorize_year, subset=['2021-H1', '2022-H1', '2022-H2'])
)

结果

enter image description here