Pandas条件格式在多个列上使用不同的条件

k97glaaz  于 2023-01-07  发布在  其他
关注(0)|答案(1)|浏览(107)

新年快乐,
我想有条件地格式化一个df,根据它的列使用多个标准,如下所示:
| | 企业_实体|2021年上半年|2022年上半年|2022年下半年|运动|
| - ------| - ------| - ------| - ------| - ------| - ------|
| 第二章|美国广播公司|无|无|一百|一百|
| 四个|定义|九十九|九十九|一百|1个|
| 八个|全球健康指数|九十七|九十七|九十八|1个|
| 二十个|JKl|九十八|九十八|九十八|无|
| 三个|移动网络运营商|九十八|九十七|九十八|1个|
| 二十三|工艺评定报告|无|无|九十八|九十八|
| 十九|STU|九十八|九十七|九十八|1个|
| 二十二|大众汽车|九十六|九十八|九十八|无|
| 十七|差分格式|九十七|九十九|九十八|-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处的函数样式器〉导致apply方法折叠为Series"。通常,这是函数返回单个值的结果,而不是类似列表的结果。
我是一个初学者,真的不知道如何解决它。感谢您的意见,一个更好的方法来完成我想达到的目标。还有一件事,我需要帮助的是如何保存为PNG文件的表格与条件格式。
谢谢。

sauutmhj

sauutmhj1#

让我们定义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'])
)

结果

相关问题