Pandas сортировка по общей сумме колонки
Помогите пожалуйста, есть датафрейм
df = pd.DataFrame({"Code":["004","001","002","003","001","001","003","004","004","004","001"],
"Products":["Name4","Name1","Name2","Name3","Name1","Name1","Name3","Name4","Name4","Name4","Name1"],
"Qty":["1","1","2","2","1","1","1","1","1","1","1"],
"Person":["Mr_X","Mr_X","Mr_X","Mr_X","Mr_X","Mr_Y","Mr_Y","Mrs_Y","Mrs_Z","Mrs_Z","Mrs_Z"],
"Price":["10","50","100","75","50","50","75","10","10","10","10"]})
Code Products Qty Person Price
0 004 Name4 1 Mr_X 10
1 001 Name1 1 Mr_X 50
2 002 Name2 2 Mr_X 100
3 003 Name3 2 Mr_X 75
4 001 Name1 1 Mr_X 50
5 001 Name1 1 Mr_Y 50
6 003 Name3 1 Mr_Y 75
7 004 Name4 1 Mrs_Y 10
8 004 Name4 1 Mrs_Z 10
9 004 Name4 1 Mrs_Z 10
10 001 Name1 1 Mrs_Z 10
я не понимаю как отсортировать Code по общей сумме QTY. Т.е. в данном примере Code 003 общее количество 3, 002 = 2, 001 = 4, 004 = 4 сортировка происходит от меньшего к большему.
ожидаемый результат:
Code Products Qty Person Price
0 002 Name2 2 Mr_X 100
1 003 Name3 2 Mr_Y 75
2 003 Name3 1 Mr_X 75
3 001 Name1 1 Mr_X 50
4 001 Name1 1 Mr_X 50
5 001 Name1 1 Mr_Y 50
6 001 Name1 1 Mr_Y 50
7 004 Name4 1 Mrs_Y 10
8 004 Name4 1 Mrs_Z 10
9 004 Name4 1 Mrs_Z 10
10 004 Name4 1 Mrs_Z 10
пытался отсортировать методом sort
df.sort_values(by=['Code','QTY'], inplace=True)
как я понимаю нужно использовать groupBy, но не понимаю как сохранить значения в колонках Person и Price. Вопрос: как отсортировать?
Ответы (1 шт):
Автор решения: Алексей Р
→ Ссылка
Если это не ошибка, и в колонке Qty - строки, сначала приводим их к целому. Потом делаем индекс как сумму Qty в группировке по Code, далее сортируем по индексу и сбрасываем его.
import pandas as pd
df = pd.DataFrame({"Code": ["001", "001", "002", "003", "001", "001", "003"],
"Products": ["Name1", "Name1", "Name2", "Name3", "Name1", "Name1", "Name3"],
"Qty": ["1", "1", "3", "1", "1", "1", "1"],
"Person": ["Mr_X", "Mr_X", "Mr_X", "Mr_X", "Mr_X", "Mr_Y", "Mr_Y"],
"Price": ["50", "50", "100", "75", "50", "50", "75"]})
df.Qty = df.Qty.astype(int)
df.index = df.groupby("Code")['Qty'].transform(sum)
df = df.sort_index().reset_index(drop=True)
print(df)
Code Products Qty Person Price
0 003 Name3 1 Mr_X 75
1 003 Name3 1 Mr_Y 75
2 002 Name2 3 Mr_X 100
3 001 Name1 1 Mr_X 50
4 001 Name1 1 Mr_X 50
5 001 Name1 1 Mr_X 50
6 001 Name1 1 Mr_Y 50
Вариант 2 - с многоуровневой сортировкой
df = pd.DataFrame({"Code": ["004", "001", "002", "003", "001", "001", "003", "004", "004", "004", "001"],
"Products": ["Name4", "Name1", "Name2", "Name3", "Name1", "Name1", "Name3", "Name4", "Name4",
"Name4", "Name1"],
"Qty": ["1", "1", "2", "2", "1", "1", "1", "1", "1", "1", "1"],
"Person": ["Mr_X", "Mr_X", "Mr_X", "Mr_X", "Mr_X", "Mr_Y", "Mr_Y", "Mrs_Y", "Mrs_Z", "Mrs_Z",
"Mrs_Z"],
"Price": ["10", "50", "100", "75", "50", "50", "75", "10", "10", "10", "10"]})
print(df)
df.Qty = df.Qty.astype(int)
df['sort'] = df.groupby("Code")['Qty'].transform(sum)
df = df.groupby(['sort', 'Code']).apply(lambda x: x.sort_values('Price', ascending=False)).drop(
columns=['sort']).reset_index(drop=True)
print(df)
Code Products Qty Person Price
0 002 Name2 2 Mr_X 100
1 003 Name3 2 Mr_X 75
2 003 Name3 1 Mr_Y 75
3 001 Name1 1 Mr_X 50
4 001 Name1 1 Mr_X 50
5 001 Name1 1 Mr_Y 50
6 001 Name1 1 Mrs_Z 10
7 004 Name4 1 Mr_X 10
8 004 Name4 1 Mrs_Y 10
9 004 Name4 1 Mrs_Z 10
10 004 Name4 1 Mrs_Z 10