PANDAS - как покрасить всю строку на основе значения в Index - PullRequest
0 голосов
/ 06 апреля 2019

У меня есть следующий MultiIndex Dataframe:

pt = df[df['Top Task Work Type'].isin(['Customer Billable','Customer Non-Billable', 'Work at risk'])].pivot_table(
    index = ['Resource id', 'End Customer Name', 'Top Task Work Type'],
    columns= ['Fiscal Quarter','Fiscal Week In Qtr Num Int'],
    values= ['Total Hours'],
    aggfunc = {'Total Hours' : np.sum}
)

, как вы можете видеть выше, я создаю сводную таблицу из листа Excel, используя в качестве фильтра «Тип рабочей задачи Top».Сводная таблица, которую он создает, имеет 40 столбцов.

Выходные данные Excel выглядят следующим образом:

https://imgur.com/j6VLxTU

Я хочу выделить красным цветом все строки, имеющие значение "Клиент не оплачивается "как:

https://imgur.com/CSMispg

Я пытался применить стиль к dt несколькими способами, такими как:

def highlight_col(x):
    #copy df to new - original data are not changed
    df = x.copy()
    #set by condition
    mask = pt.index.get_level_values('Top Task Work Type') == 'Customer Non-Billable'
    df.loc[mask, :] = 'background-color: yellow'
    df.loc[~mask,:] = 'background-color: ""'
    return df    

pt.style.apply(highlight_col, axis=1)

, но безуспешно.Мне удалось покрасить строку на основе столбца для определенного значения, но я хочу покрасить все строки, имеющие значение «Customer Non-Billable»

любая помощь очень ценится

Ответы [ 2 ]

1 голос
/ 06 апреля 2019

Здесь используется стиль с использованием стратегии Pandas> 0,20.

import pandas as pd
from pandas.compat import StringIO
import xlsxwriter
import xlwt
import openpyxl

csvdata = StringIO("""date,LASTA,LASTB,LASTC
1999-03-15,-2.5597,8.20145,16.900
1999-03-17,2.6375,8.12431,17.125
1999-03-18,2.6375,-8.27908,16.950
1999-03-19,2.6634,8.54914,17.325
1999-04-06,2.8537,7.63703,17.750""")

df = pd.read_csv(csvdata, sep=",", index_col="date", parse_dates=True, infer_datetime_format=True)

def color_negative_red(val):
    color = 'red' if val < 0 else 'white'
    return 'background-color: %s' % color            

df.style.\
    applymap(color_negative_red).\
    to_excel('styletest.xlsx', engine='openpyxl')

Стиль с использованием стратегии XlsxWriter.Возможно, это обеспечивает более легкий доступ к данным, которые нужно стилизовать.

import pandas as pd
from pandas.compat import StringIO
import xlsxwriter
import xlwt
import openpyxl

csvdata = StringIO("""date,LASTA,LASTB,LASTC
1999-03-15,-2.5597,8.20145,16.900
1999-03-17,2.6375,8.12431,17.125
1999-03-18,2.6375,-8.27908,16.950
1999-03-19,2.6634,8.54914,17.325
1999-04-06,2.8537,7.63703,17.750""")

df = pd.read_csv(csvdata, sep=",", index_col="date", parse_dates=True, infer_datetime_format=True)

# Create a Pandas Excel writer using XlsxWriter as the engine.
writer = pd.ExcelWriter("styletest.xlsx", engine='xlsxwriter')

# Convert the dataframe to an XlsxWriter Excel object.
df.to_excel(writer, sheet_name='Sheet1')

# Get the xlsxwriter workbook and worksheet objects.
workbook  = writer.book
worksheet = writer.sheets['Sheet1']

# Add some cell formats.
format1 = workbook.add_format({'num_format': '#,##0.00'})
format2 = workbook.add_format({'num_format': '0%'})
format3 = workbook.add_format({'bg_color': 'yellow'})

# Set the column width and format.
worksheet.set_column('B:B', 18, format2)
worksheet.set_row(2, 5, format3)

# Set the format but not the column width.
worksheet.set_column('C:C', None, format2)

# Close the Pandas Excel writer and output the Excel file.
writer.save()

Переход к подмножеству данных в DataFrame с помощью Multiindex.

import pandas as pd
import numpy as np

midx = pd.MultiIndex.from_product([['A0','A1'], ['B0','B1','B2','B3']])
columns = ['foo', 'bar']
df = pd.DataFrame(np.arange(16).reshape((len(midx), len(columns))),index=midx, columns=columns)

def style(val):
    return 'background-color: yellow'

idx = pd.IndexSlice[:, 'B0':'B1']
print(df.loc[idx,:])

df.style.applymap(style, subset=idx).to_excel('styletest.xlsx', engine='openpyxl')

.указанный IndexSlice не работает.Но это должен быть образец.

0 голосов
/ 07 апреля 2019

Я сделал это с помощью XMLwriter

Я впервые создал стиль для использования:

########## Format definition for CAP #########
format_cap = workbook.add_format({'bg_color': '#FFC7CE',
                               'font_color': '#9C0006'})

Затем применил его:

worksheet_all.conditional_format('C5:BC500', {'type': 'formula',
                                         'criteria': '=LEFT($C5, 250)="Customer Non-Billable"', 
                                          'format': format_cap})

это сработало

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...