如何更改数据框中与包含浮点值和字符串值混合的条件匹配的行的文本字体粗细?

How to change font-weight of the text for the row in dataframe that matches the criteria which contains a mixture of float and string values?

data = {'Rest (N=11570)': {4: '7369 (62.28%)', 1: '7016 (59.98%)', 37: '734 (6.14%)', 40: '9829 (79.09%)', 43: '37 (2.42%)', 5: '3080 (25.29%)', 6: '1273 (9.43%)', 12: '6992 (62.61%)', 15: '777 (5.47%)', 18: '332 (2.10%)', 21: '7 (3.44%)', 24: '2013 (14.39%)', 27: '290 (1.81%)', 30: '2048 (14.98%)', 33: '9 (3.85%)', 36: '353 (2.15%)', 351: '0.08 [0.05 - 0.14]', 354: '0.08 [0.05 - 0.13]', 357: '0.08 [0.04 - 0.14]', 168: '4.00 [3.72 - 4.30]', 171: '3.96 [3.62 - 4.27]', 174: '4.22 [3.92 - 4.50]', 177: '3.81 [3.44 - 4.12]', 180: '3.93 [3.60 - 4.20]'}, 'p_value': {4: '<0.001', 1: '0.005', 37: '0.056', 40: '<0.001', 43: '<0.001', 5: '<0.001', 6: '<0.001', 12: '<0.001', 15: '<0.001', 18: '<0.001', 21: '<0.001', 24: '<0.001', 27: '<0.001', 30: '<0.001', 33: '<0.001', 36: '<0.001', 351: '0.366', 354: '<0.001', 357: '0.008', 168: '0.012', 171: '0.004', 174: '0.220', 177: '0.047', 180: '0.025'}, 'ks_score': {4: nan, 1: nan, 37: nan, 40: nan, 43: nan, 5: nan, 6: nan, 12: nan, 15: nan, 18: nan, 21: nan, 24: nan, 27: nan, 30: nan, 33: nan, 36: nan, 351: '0.02', 354: '0.05', 357: '0.03', 168: '0.03', 171: '0.03', 174: '0.02', 177: '0.02', 180: '0.03'}}

我有这些数据,我需要使用 pandas 对其进行一些样式设置。我正在尝试为具有 p_value < 0.05 or p_value == '<0.001' 的行设置粗体文本。但我不知道该怎么做。我正在阅读来自 https://pandas.pydata.org/pandas-docs/stable/user_guide/style.html 的文档。

def __highlight_pvalue__(x):
        
        return ['font-weight:bold' if p == '<0.001' or float(p) < 0.05 else p for p in x]

调用样式函数:

df.style.apply(__add_categorical_header_row__, row_idxs = row_indices, row_labels = row_labels, axis = None).apply(__highlight_pvalue__)

函数 __add_categorical_header_row__ 工作正常,但是当我添加 __highlight_pvalue__ 函数时,出现以下错误。我明白错误的意思,但不知道如何解决它。

could not convert string to float: '7369 (62.28%)'

我也尝试将 try except 放入 __hightlight_pvalue__ 函数中,但没有成功。

首先,您的数据字典应该更正。所有 nan 应设置为 np.nan。下次您创建数据供其他人尝试时,您必须考虑一下!

其次,您添加了带有函数的样式代码,但并未真正显示该函数的作用。您没有在其中包含函数详细信息。

假设您的第一个设置样式的函数有效,该函数的问题是您要为每一列检查它。由于您使用 .apply 没有轴,它默认为 0,即列 - 一次一列。由于您的第一列似乎是字符串,因此无法将值转换为字符串;因此,错误。

因此,要解决此问题,您的 __highlight_pvalue__ 函数需要更改为仅检查 pvalue。

data = {'Rest (N=11570)': {4: '7369 (62.28%)', 1: '7016 (59.98%)', 37: '734 (6.14%)', 40: '9829 (79.09%)', 43: '37 (2.42%)', 5: '3080 (25.29%)', 6: '1273 (9.43%)', 12: '6992 (62.61%)', 15: '777 (5.47%)', 18: '332 (2.10%)', 21: '7 (3.44%)', 24: '2013 (14.39%)', 27: '290 (1.81%)', 30: '2048 (14.98%)', 33: '9 (3.85%)', 36: '353 (2.15%)', 351: '0.08 [0.05 - 0.14]', 354: '0.08 [0.05 - 0.13]', 357: '0.08 [0.04 - 0.14]', 168: '4.00 [3.72 - 4.30]', 171: '3.96 [3.62 - 4.27]', 174: '4.22 [3.92 - 4.50]', 177: '3.81 [3.44 - 4.12]', 180: '3.93 [3.60 - 4.20]'}, 'p_value': {4: '<0.001', 1: '0.005', 37: '0.056', 40: '<0.001', 43: '<0.001', 5: '<0.001', 6: '<0.001', 12: '<0.001', 15: '<0.001', 18: '<0.001', 21: '<0.001', 24: '<0.001', 27: '<0.001', 30: '<0.001', 33: '<0.001', 36: '<0.001', 351: '0.366', 354: '<0.001', 357: '0.008', 168: '0.012', 171: '0.004', 174: '0.220', 177: '0.047', 180: '0.025'}, 'ks_score': {4: np.nan, 1: np.nan, 37: np.nan, 40: np.nan, 43: np.nan, 5: np.nan, 6: np.nan, 12: np.nan, 15: np.nan, 18: np.nan, 21: np.nan, 24: np.nan, 27: np.nan, 30: np.nan, 33: np.nan, 36: np.nan, 351: '0.02', 354: '0.05', 357: '0.03', 168: '0.03', 171: '0.03', 174: '0.02', 177: '0.02', 180: '0.03'}}
data = pd.DataFrame(data)

def __highlight_pvalue__(x):
        
    if x.p_value == '<0.001' or float(x.p_value) < 0.05:
        return ['font-weight: bold'] * x.shape[0] # number of colums
    else: 
        return ''
          
      

生成的数据帧