У меня есть следующий фрейм данных, 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 ДЛЯ КАЖДОГО ЗНАЧЕНИЯ человека.
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
Затем я попробовал аналогичную стратегию, вложив лямбда-функцию в еще одно условие 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'
Итак, как мне применить эти стили для каждого z для каждого человека?Кроме того, как я могу добавить нижнюю границу в последней строке каждого человека, не имея возможности индивидуально оформлять группы и объединять их?
Примечание: Да, цвета в цветах не будут соответствовать изображению, и это нормально.
Подробнее здесь: https://stackoverflow.com/questions/788 ... -pandas-st