df.style.apply центрирует многоиндексные значения на дисплее

#python #pandas #jupyter

#python #панды #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))
 

в Jupyter я получаю следующие изображения (к сожалению, я не могу загрузить скриншоты)

 0 0 0 a
    1 a
  1 0 a
    1 a
1 0 0 a
    1 a
  1 0 a
    1 a
 

     0 a
  0  
    1 a
0
    0 a
  1  
    1 a
    0 a
  0  
    1 a
1
    0 a
  1  
    1 a
 

1. Как мне предотвратить это изменение?

2: Поскольку мне на самом деле не совсем не нравится второй формат: Как я могу исправить фоны в мультииндексе, чтобы границы групп на каждом уровне мультииндекса стали визуально четкими?

(PS: в моем реальном коде лямбда-выражение возвращается 'background: green' для некоторых строк)

Ответ №1:

Здесь и здесь на GitHub есть небольшое обсуждение относительно vertical-alignment атрибута CSS по умолчанию, который следует применять к th ‘s; Я думаю, что эти стили CSS должны дать вам хорошую отправную точку:

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

Это выровняло бы мультииндексы по верхнему краю и придало бы им красную рамку.

Обновить

Я не знаю, как вы оцениваете свой стиль / условия, но если бы у вас были какие-то ‘b’ в вашем DF (например 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
 

и, наконец, объедините все вместе (очищено здесь), например:

 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))
 

Комментарии:

1. Как мне совместить это с изменениями стиля, которые я вношу с помощью style.apply? Я не могу просто связать это цепью, потому что Styler object has no attribute style

2. @Bananach Я обновил свой ответ, чтобы показать, как объединять стили; Я не знаю, как вы применяете вещи прямо сейчас, но я думаю, что это самый чистый способ стилизации с использованием функций (отсюда и дополнительные .applymap() ).