Pandas функция стиля для специальных столбцов
Я пытаюсь написать функцию для использования с стилем pandas. Я хочу, чтобы высокие столбцы указывались в аргументах. Это не очень элегантно, но, например:
data = pd.DataFrame(np.random.randn(5, 3), columns=list('ABC'))
def highlight_cols(df, cols, colcolor = 'gray'):
for col in cols:
for dfcol in df.columns:
if col == cols:
color = colcolor
return ['background-color: %s' % color]*df.shape[0]
затем вызовите с помощью:
data.style.apply(highlight_cols(cols=['B','C']))
Я получаю сообщение об ошибке:
( "Объект" Серии "не имеет атрибутов" столбцы ")
Я думаю, что я принципиально не совсем понимаю, как стилист вызывает и применяет эту функцию.
Спасибо,
Ответы
Ответ 1
Я думаю, вы можете использовать Slicing в Styles
для выбора столбцов B
и C
, а затем Styler.applymap
для стильных стилей.
import pandas as pd
import numpy as np
data = pd.DataFrame(np.random.randn(5, 3), columns=list('ABC'))
#print (data)
def highlight_cols(s):
color = 'grey'
return 'background-color: %s' % color
data.style.applymap(highlight_cols, subset=pd.IndexSlice[:, ['B', 'C']])
![pic]()
Если вы хотите больше цветов или быть более гибкими, используйте Styler.apply(func, axis=None)
, функция должна вернуть DataFrame
с теми же метками индекса и столбца:
import pandas as pd
import numpy as np
data = pd.DataFrame(np.random.randn(5, 3), columns=list('ABC'))
#print (data)
def highlight_cols(x):
#copy df to new - original data are not changed
df = x.copy()
#select all values to default value - red color
df.loc[:,:] = 'background-color: red'
#overwrite values grey color
df[['B','C']] = 'background-color: grey'
#return color df
return df
data.style.apply(highlight_cols, axis=None)
![pic1]()
Ответ 2
Вы можете сделать это немного более динамично:
data = pd.DataFrame(np.random.randn(5, 3), columns=list('ABC'))
# dictionary of column colors
coldict = {'A':'grey', 'C':'yellow'}
def highlight_cols(s, coldict):
if s.name in coldict.keys():
return ['background-color: {}'.format(coldict[s.name])] * len(s)
return [''] * len(s)
data.style.apply(highlight_cols, coldict=coldict)
![enter image description here]()
Ответ 3
Работает отлично! Однако как я могу заставить его работать только для заголовков, а не для всего столбца?
Ответ 4
Как насчет того, если мы хотим, чтобы этот процесс только для 1 столбца? Например, будет выделен только столбец "А". Как я могу это сделать?