df.style.apply 在显示中居中显示多索引值

Ban*_*ach 4 python pandas jupyter

当我跑步时

import pandas as pd
from IPython.display import display
df = pd.DataFrame('a',index=pd.MultiIndex.from_product([[0,1]]*3),columns=['A'])
display(df)
display(df.style.apply(lambda x: ['']*len(x),axis=1))
Run Code Online (Sandbox Code Playgroud)

在 Jupyter 中,我得到以下显示(不幸的是我无法上传屏幕截图)

0 0 0 a
    1 a
  1 0 a
    1 a
1 0 0 a
    1 a
  1 0 a
    1 a
Run Code Online (Sandbox Code Playgroud)

-

    0 a
  0  
    1 a
0
    0 a
  1  
    1 a
    0 a
  0  
    1 a
1
    0 a
  1  
    1 a
Run Code Online (Sandbox Code Playgroud)

1:如何防止这种变化?

2:因为我实际上并不完全不喜欢第二种格式:如何修复多重索引中的背景,以便每个多重索引级别中的组的边界在视觉上变得清晰?

(PS:在我的实际代码中,lambda 返回'background: green'某些行)

Asm*_*mus 7

GitHub 上的这里这里有一些关于vertical-alignment应该应用于's的默认 CSS 属性的相关讨论th;我认为这些 CSS 样式应该为您提供一个很好的起点:

s=df.style.set_table_styles([
    {'selector': 'th',
    'props': [
        ('border-style', 'solid'),
        ('border-color', 'Red'),
        ('vertical-align','top')
    ]
    }]
)
HTML(s.render())
Run Code Online (Sandbox Code Playgroud)

这将使 MultiIndices 顶部对齐,并给它们一个红色边框。

更新

我不知道你如何评估你的样式/条件,但如果你的 DF 中有一些 'b'(例如df.loc[0,0,1]='b', df.loc[1,0,1]='b'),那么你可以定义一个样式函数,例如:

def color_b_green(value):
  if value == 'b':
    color = 'blue'
  else:
    color = 'black'
  return 'color: %s' % color
Run Code Online (Sandbox Code Playgroud)

最后将所有内容链接在一起(在这里清理),例如:

styles=[
    {'selector': 'th',
    'props': [
        ('border-style', 'solid'),
        ('border-color', 'Red'),
        ('vertical-align','top')
    ]
    }]

(df.style
    .apply(lambda x: ['']*len(x),axis=1)
    .applymap(color_b_green)
    .set_table_styles(styles))
Run Code Online (Sandbox Code Playgroud)