использование df.style.applymap для раскрашивания фона ячейки для нескольких листов Excel

#python #excel #pandas

#python #excel #панды

Вопрос:

MRE создан с помощью https://jakevdp.github.io/PythonDataScienceHandbook/03.05-hierarchical-indexing.html , потрясающее резюме по иерархической индексации

MRE:

 index = pd.MultiIndex.from_product([[2013, 2014,2015, 2016]],
                                   names=['year'])
columns = pd.MultiIndex.from_product([['Bob', 'Guido', 'Sue'], ['HR', 'group']])

data = np.array([[1,2,3,4,5,"g1"],
                 [3,6,1,3,2,"g2"],
                 [3,6,1,2,3,"g1"],
                 [6,7,8,11,23,"g2"]])

all_df = pd.DataFrame(data, index=index, columns=columns)
  

Использование одного df и раскрашивание фона ячейки в зависимости от условий работает нормально, однако, когда я пытаюсь применить его к нескольким листам Excel, это, похоже, не работает.

вот мой код:

 def coloring(val):
    color = '#EDFFE7' if val in lst else 'white'
    return f"background-color: {color}"


groups = ["g1", "g2"]
writer = pd.ExcelWriter("test.xlsx", engine="xlsxwriter")
for g in groups:
    df = all_df.loc[all_df[("Sue","group")] == g].copy()
    df.style.applymap(coloring).to_excel(writer, sheet_name=g)
writer.save()
  

Это

Кроме того, как добавить индекс для параметра подмножества в метод applymap?

Ответ №1:

Кажется, вам нужно связать обе строки, потому df.style.applymap(coloring) что не назначается обратно:

 df.style.applymap(coloring).to_excel(writer, sheet_name=g)
  

вместо:

 df.style.applymap(coloring)
df.to_excel(writer, sheet_name=g)
  

Или назначить обратно:

 df = df.style.applymap(coloring)
df.to_excel(writer, sheet_name=g)
  

Редактировать:

для меня работает хорошо, если значения в списке являются целыми числами, потому что при использовании np.array для смешанных строк данных с числами numpy преобразует все данные в объекты:

 index = pd.MultiIndex.from_product([[2013, 2014,2015, 2016]],
                                   names=['year'])
columns = pd.MultiIndex.from_product([['Bob', 'Guido', 'Sue'], ['HR', 'group']])

data = np.array([[1,2,3,4,5,"g1"],
                 [3,6,1,3,2,"g2"],
                 [3,6,1,2,3,"g1"],
                 [6,7,8,11,23,"g2"]])

all_df = pd.DataFrame(data, index=index, columns=columns)

print (all_df.dtypes)

Bob    HR       object
       group    object
Guido  HR       object
       group    object
Sue    HR       object
       group    object
dtype: object
  

Так что, если передать вложенные списки DataFrame всем, все работает хорошо для меня:

 index = pd.MultiIndex.from_product([[2013, 2014,2015, 2016]],
                                   names=['year'])
columns = pd.MultiIndex.from_product([['Bob', 'Guido', 'Sue'], ['HR', 'group']])

data = [[1,2,3,4,5,"g1"],
        [3,6,1,3,2,"g2"],
        [3,6,1,2,3,"g1"],
        [6,7,8,11,23,"g2"]]

all_df = pd.DataFrame(data, index=index, columns=columns)

print (all_df.dtypes)
Bob    HR        int64
       group     int64
Guido  HR        int64
       group     int64
Sue    HR        int64
       group    object
dtype: object
  

 def coloring(val):
    color = '#EDFFE7' if val in lst else 'white'
    return f"background-color: {color}"

writer = pd.ExcelWriter("test.xlsx", engine="xlsxwriter")

groups = ["g1", "g2"]
lst = [1,2,3]


for g in groups:
    df = all_df.loc[all_df[("Sue","group")] == g].copy()
    #print (df)
    df.style.applymap(coloring).to_excel(writer, sheet_name=g)

writer.save()
  

Комментарии:

1. df.style.applymap(coloring).to_excel(writer, sheet_name=g) похоже, все еще не работает. и также попытался назначить обратный метод.

2. @Ambleu — Возможно ли создать некоторый образец данных для проверки этого?

3. хм … на самом деле это работает с данными, которые я только что создал. Единственное отличие заключается в том, что мои исходные данные представляют собой многоиндексный фрейм данных. Позвольте мне попробовать создать MRE с несколькими индексами и попробовать.

4. Я обновил свой вопрос новым MRE, извините, мне пришлось научиться создавать многоиндексный столбец dataframe.