Python - Pandas - Style.ApplyMap 工作异常

Python - Pandas - Style.ApplyMap working strange

任何人都可以帮助我解决以下奇怪的情况吗? 所以我有以下 Table ( Oracle ),如下所示: Screenshot

回到 python,我创建了以下脚本。我连接到数据库,然后从 table 中检索数据。之后,数据框建立在 table 的内容之上。使用函数 highlightGreaterThen 我想根据值向单元格添加背景颜色。不幸的是,这并没有按预期发生,因为即使 IF 不是本意,该函数似乎仍在继续执行 ELSE 子句。

#! /usr/bin/python

# import the necessary components first
import cx_Oracle
import config
import pandas as pd

connection = cx_Oracle.connect(
    config.username,
    config.password,
    config.dsn,
    encoding=config.encoding
)

mon_user_accounts = """ SELECT USER_ID, USER_NAME, ACCOUNT_STATUS, REMAINING_DAYS, 
                        expiry_date , inserted_time as "STATUS_TIME"
                        FROM KVS_SERVICE.mon_user_accounts 
                        WHERE inserted_time = (select max(inserted_time) from mon_user_accounts) """

df_usr_acc = pd.read_sql(mon_user_accounts, con=connection)

def highlightGreaterThen(color):
    for value in df_usr_acc['REMAINING_DAYS']:
        if value <= 30:
            color = 'chocolate'
        else:
            color = 'honeydew'
    return 'background-color: %s' % color


s = df_usr_acc.style.set_table_attributes('class="table table-hover table-condensed"').applymap(
    highlightGreaterThen, subset=['USER_ID'])
to_render = s.hide_index().render()
print(to_render)

如果我手动执行该函数,并在其中添加一些打印,它会打印出所需的结果,但是在我的脚本中执行它时,效果并不好。

for value in df_usr_acc['REMAINING_DAYS']:
    if value <= 30:
        print('chocolate')
    else:
        print('honeydew')

结果是:

honeydew
chocolate
honeydew
honeydew
honeydew
honeydew
honeydew

但是执行整个脚本时,结果是:

T_ce7b8808_c6a5_11ea_9513_34e12def64cdrow0_col0 { background-color:  honeydew;}
T_ce7b8808_c6a5_11ea_9513_34e12def64cdrow1_col0 { background-color:  honeydew;}
T_ce7b8808_c6a5_11ea_9513_34e12def64cdrow2_col0 { background-color:  honeydew;}
T_ce7b8808_c6a5_11ea_9513_34e12def64cdrow3_col0 { background-color:  honeydew;}
T_ce7b8808_c6a5_11ea_9513_34e12def64cdrow4_col0 { background-color:  honeydew;}
T_ce7b8808_c6a5_11ea_9513_34e12def64cdrow5_col0 { background-color:  honeydew;}
T_ce7b8808_c6a5_11ea_9513_34e12def64cdrow6_col0 { background-color:  honeydew;}

我做错了什么?

谢谢。

好吧,似乎在函数内循环时,代码仅附加了最后遇到的值。话虽如此,当使用打印时,迭代已成功完成。 功能已更改为:

def userAccountHighlightGreaterThen(color):
    return ['background-color: chocolate'
            if value <=30
            else 'background-color: honeydew'
            for value in df_usr_acc['REMAINING_DAYS']
            ]

之后,我使用 style.apply 而不是 style.applymap 调用函数。 这解决了我的问题。希望对你也有帮助。