2016-12-17 8 views
1

Я пытаюсь покрасить, выделить или изменить любовь Pandon pandas DataFrame на основе значения ячейки. например если ячейки в каждой строке больше, чем ячейка в первом столбце этой строки, выделите ячейку как красный (или любой другой цвет), иначе оставьте ее как есть.Условно формат Python pandas cell

Я написал цикл здесь:

for index in range(0, df.shape[0]): 
    for column in range(1, df.shape[1]): # from 1 not from 0 because I only need # to compare the 2nd to the last cell of each row with the 1st cell in the row 

     if df.iloc[index][column] - df_BDE_n_months_avg_std_pct.iloc[index][0] > 0: 
      then "PLEASE PUT YOUR HELP HERE, I NEED A PIECE OF CODE THAT CAN HIGHLIGHT THE CELL" 
     else: 
      "DO NOTHING" 

До сих пор я не нашел способ сделать это. Любая помощь будет отличной.

ответ

3

the style docs: От

Вы можете применить условное форматирование, визуальные стилизации в DataFrame в зависимости от данных в пределах, используя свойство DataFrame.style .

import pandas as pd 
df = pd.DataFrame([[2,3,1], [3,2,2], [2,4,4]], columns=list("ABC")) 

df.style.apply(lambda x: ["background: red" if v > x.iloc[0] else "" for v in x], axis = 1) 

enter image description here


Edit: форматировать специфические клетки, вы можете добавить условие шашек, чтобы проверить имя элемента с Series.iteritems() или проверить индекс с enumerate(), например, если вы хотите форматировать, начиная с колонки 3, вы можете использовать Перечислим и проверить индекс:

df = pd.DataFrame([[2,3,-3], [3,2,7], [2,4,4]], columns=list("ABC")) 

df.style.apply(lambda x: ["background-color: #ff33aa" 
          if (i >= 2 and (v > x.iloc[0] + x.iloc[1] 
              or v < x.iloc[0] - x.iloc[1])) 
          else "" for i, v in enumerate(x)], axis = 1) 

enter image description here

+0

Спасибо Psidom! Ваше решение отлично! Дополнительный вопрос, так что, если я хочу установить правило как для каждой строки, из 3-й ячейки x, если x> 1-я ячейка + 2-я ячейка, или x <1-я ячейка - 2-я ячейка, затем выделите, в противном случае ничего не сделаете? Я думаю, что здесь я вижу, как выбрать диапазон ячеек, который я хочу сравнить? Ваш метод автоматически исключил первую ячейку, поскольку она не будет больше, чем сама, но она становится немного более сложной, когда применяются другие правила. – thatMeow

+0

Вы можете «перечислить» каждую строку и проверить индекс, только изменить ячейку, если в вашем случае индекс *> = 2 *. См. Обновление. – Psidom

+0

Еще раз спасибо Psidom. Я еще не много играл с пандами, и ваши предложения неоценимы. Я ценю ваше время :) – thatMeow