Неожиданно, правда? Недавно столкнулась с такой потребностью по работе: нужно было собрать всё про клиента в одной строке - заказы, статусы, комментарии - чтобы не плодить дубли.
Классика разговора:
- А такое можете?
- Могём!
Короче можно сделать аккуратно и компактно, всё в одной строке! 👇
Создадим датафреймчик
import pandas as pd
from openpyxl import load_workbook
from openpyxl.styles import Alignment
df = pd.DataFrame({
'client_id': [1, 1, 1, 2, 2],
'order_id': [101, 102, 103, 201, 202],
'comment': ['срочная доставка', 'оплата картой', 'повторный заказ', 'новый клиент', 'скидка 10%']
})
Теперь объединим данные по клиенту. И вот тут используем переносы строк внутри ячейки \n. Но в юпитере их видно не будет. Смотрите на фото как выглядит в Юпитере. Строка будет типа такой: срочная доставка\nоплата картой\nповторный заказ
df_grouped = df.groupby('client_id', as_index=False).agg({
'order_id': lambda x: '\n'.join(map(str, x)),
'comment': lambda x: '\n'.join(x)
})💡Теперь само волшебство:
file = 'clients_info.xlsx'
#Сохраняем в Excel
df_grouped.to_excel(file, index=False, engine='openpyxl')
# ✨ Делаем переносы видимыми в Excel
wb = load_workbook(file) # открываем созданный файл Excel
ws = wb.active # выбираем активный лист
# пропускаем заголовок,проходит по всем ячейкам.
for row in ws.iter_rows(min_row=2, max_row=ws.max_row):
for cell in row:
# Если в ячейке есть текст с переносами — включаем wrapText
if isinstance(cell.value, str) and '\n' in cell.value:
cell.alignment = Alignment(wrapText=True)
wb.save(file) # сохраняем файл счастья
😀 Excel покажет всё в столбик прямо внутри ячейки, аккуратно и читаемо!
Лайк за пост в рабочий субботний день! 🤪 Кто осилил - тот молодец!
