Объединение строк разных столбцов
К примеру, имеем такой DataFrame. Можно ли с помощью внутренних методов объединить состав заказов, если дата покупки совпадает?
my_df = pd.DataFrame({'Дата заказа № 1': ['10.02.19', '09.11.19', '15.01.19'],
'Состав заказа № 1': ['рыба', 'бананы', 'гречка'],
'Дата заказа № 2': ['11.02.19', '09.11.19', '21.02.19'],
'Состав заказа № 2': ['fish', 'beans', 'bread'],
'Дата заказа № 3': ['01.12.19', '09.11.19', '25.03.19'],
'Состав заказа № 3': ['конфеты', 'мёд', 'молоко'],
'Дата заказа № 4': ['01.12.19', '12.11.19', '27.05.19'],
'Состав заказа № 4': ['овощи', 'макароны', 'птица'],
'Дата заказа № 5': ['01.12.19', '12.11.19', '25.09.19'],
'Состав заказа № 5': ['мясо', 'фасоль', 'хлеб']},
columns=['Дата заказа № 1', 'Состав заказа № 1','Дата заказа № 2', 'Состав заказа № 2','Дата заказа № 3', 'Состав заказа № 3','Дата заказа № 4', 'Состав заказа № 4','Дата заказа № 5', 'Состав заказа № 5'])'
По-хорошему, мне надо получить лист листов с заказами:
my_list=[['рыба'], ['fish'], ['конфеты','овощи','мясо'], ['бананы', 'beans', 'мёд'], ['макароны', 'фасоль'], ['гречка'], ['bread'], ['молоко'], ['птица'], ['хлеб']]
Но я пришёл к выводу (возможно, ошибочному), что проще сначала объединить заказы в самом фрейме данных, а уже потом "выцепить" их циклом.
Ориентировочно, хотелось бы получить такой фрейм, но итоговый результат может и отличаться от приведенного ниже: для меня достаточно объединить заказы одной даты в одну строчку:
Ответы (1 шт):
Работать с данными в таком (широком) формате очень неудобно. Лучше сделать UNPIVOT и получить фрейм с двумя столбцами Date и Item - с таким форматом работать будет гораздо проще:
df.columns = df.columns.str.replace("\s*№.*$", "", regex=True)
t = pd.DataFrame({
"Date": df.loc[:, "Дата заказа"].stack().reset_index()[0],
"Item": df.loc[:, "Состав заказа"].stack().reset_index()[0]
})
промежуточный результат:
In [214]: t
Out[214]:
Date Item
0 10.02.19 рыба
1 11.02.19 fish
2 01.12.19 конфеты
3 01.12.19 овощи
4 01.12.19 мясо
5 09.11.19 бананы
6 09.11.19 beans
7 09.11.19 мёд
8 12.11.19 макароны
9 12.11.19 фасоль
10 15.01.19 гречка
11 21.02.19 bread
12 25.03.19 молоко
13 27.05.19 птица
14 25.09.19 хлеб
теперь эти данные можно легко сгруппировать:
res = t.groupby("Date")["Item"].apply(list).reset_index()
результат:
In [216]: res
Out[216]:
Date Item
0 01.12.19 [конфеты, овощи, мясо]
1 09.11.19 [бананы, beans, мёд]
2 10.02.19 [рыба]
3 11.02.19 [fish]
4 12.11.19 [макароны, фасоль]
5 15.01.19 [гречка]
6 21.02.19 [bread]
7 25.03.19 [молоко]
8 25.09.19 [хлеб]
9 27.05.19 [птица]

