Как по-разному стилизовать группы строк в зависимости от значения столбца с помощью Pandas StylerPython

Программы на Python
Anonymous
Как по-разному стилизовать группы строк в зависимости от значения столбца с помощью Pandas Styler

Сообщение Anonymous »

Чего я пытаюсь достичь:
У меня есть следующий фрейм данных, df:

Код: Выделить всё

data = {'person': {0: 'a',
1: 'a',
2: 'a',
3: 'a',
4: 'a',
5: 'a',
6: 'b',
7: 'b',
8: 'b',
9: 'b',
10: 'b',
11: 'b',
12: 'c',
13: 'c',
14: 'c',
15: 'c',
16: 'c',
17: 'c'},
'x': {0: 1,
1: 1,
2: 1,
3: 1,
4: 1,
5: 1,
6: 1,
7: 1,
8: 1,
9: 1,
10: 1,
11: 1,
12: 1,
13: 1,
14: 1,
15: 1,
16: 1,
17: 1},
'y': {0: 2,
1: 2,
2: 2,
3: 2,
4: 2,
5: 2,
6: 2,
7: 2,
8: 2,
9: 2,
10: 2,
11: 2,
12: 2,
13: 2,
14: 2,
15: 2,
16: 2,
17: 2},
'z': {0: 'foo',
1: 'foo',
2: 'foo',
3: 'bar',
4: 'bar',
5: 'bar',
6: 'foo',
7: 'foo',
8: 'foo',
9: 'bar',
10: 'bar',
11: 'bar',
12: 'foo',
13: 'foo',
14: 'foo',
15: 'bar',
16: 'bar',
17: 'bar'}}

df = pd.DataFrame.from_dict(data, orient='columns')
И я хочу по-разному оформить группы строк (с разными наборами чередующихся цветов) в зависимости от значения z ДЛЯ КАЖДОГО ЗНАЧЕНИЯ человека.
И я хочу по-разному оформить группы строк (с разными наборами чередующихся цветов) в зависимости от значения z ДЛЯ КАЖДОГО ЗНАЧЕНИЯ человека.
p>

Мой желаемый результат:
[img]https://i .sstatic.net/ixUVDAj8.png[/img]


Что я пробовал:
Изначально я решил Я мог бы использовать вложенный цикл для выделения каждого z для каждого человека. Сначала я попробовал протестировать это только на одном человеке, вот так:

Код: Выделить всё

COLORS = {
'foo':['red','green'],
'bar':['blue','yellow']
}

test = df.loc[df.person=='a'].copy()

sub_person = pd.DataFrame()

for val in test.z.unique():
i_test = test.loc[test.z==val].copy()
c1 = COLORS[val][0]
c2 = COLORS[val][-1]
css_alt_rows = f'background-color: {c1}; color: {c2};'

i_test = (i_test.style.apply(lambda col: np.where(col.index % 2, css_alt_rows,None)))

sub_person = pd.concat([sub_person,i_test])
Я подумал, что это умное решение для индивидуальной обработки различных стилей, но столкнулся с ошибкой:

Код: Выделить всё

TypeError: cannot concatenate object of type ''; only Series and DataFrame objs are valid
Итак, оказывается, что этот код не может работать, поскольку вы не можете объединить объекты Styler.
Затем я попробовал аналогичную стратегию, вложив лямбда-функцию в еще одно условие np.where():

Код: Выделить всё

COLORS = {
'foo':['red','green'],
'bar':['blue','yellow']
}

test = df.loc[df.person=='a'].copy()

for val in test.z.unique():

c1 = COLORS[val][0]
c2 = COLORS[val][-1]
css_alt_rows = f'background-color: {c1}; color: {c2};'

test = (test.style.apply(lambda col: np.where(np.where(col.index % 2, css_alt_rows,None),None)))

Но я получаю следующую ошибку:

Код: Выделить всё

AttributeError: 'Styler' object has no attribute 'style'
Это имеет смысл, поскольку после первой итерации цикла test является объектом стиля, в результате чего test.style вызывает ошибку на следующей итерации .

Итак, как мне применить эти стили для каждого z для каждого человека?Кроме того, как я могу добавить нижнюю границу в последней строке каждого человека, не имея возможности индивидуально оформлять группы и объединять их?
Примечание: Да, цвета в цветах не будут соответствовать изображению, и это нормально.

Подробнее здесь: https://stackoverflow.com/questions/788 ... -pandas-st

Вернуться в «Python»