#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()
).