#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.