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 调用函数。
这解决了我的问题。希望对你也有帮助。
任何人都可以帮助我解决以下奇怪的情况吗? 所以我有以下 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 调用函数。 这解决了我的问题。希望对你也有帮助。