У меня есть следующий код, который находит общие и уникальные продажи для каждого сотрудника, используя группу, с помощью Employee_id
и агрегацией с Customer_id
.
Sales.groupby('Employee_id').agg({
'Customer_id': [
('total_sales', 'count'),
('unique_sales', 'nunique')
]})
Важно знать, что я буду выполнять агрегации с другими столбцами, но пока это все, что я написал. Поэтому, если у вас есть предлагаемое решение, я прошу вас подумать об этом, если это имеет значение.
Хотя это делает именно то, что я хочу с точки зрения вычисления общих и уникальных продаж для каждого сотрудника и создания двух столбцов, он создает имена вложенных столбцов. Итак, имена столбцов выглядят так: [("Customer_id", "total_sales"), ("Customer_id", "unique_sales")], чего я не хочу. Есть ли способ легко избавиться от вложенной части, чтобы включить только ['total_sales', 'unique_sales'] или проще всего переименовать столбцы, когда я закончил все?
Спасибо!
Вы можете просто переименовать столбцы:
import numpy as np
import pandas as pd
np.random.seed(2018)
df = pd.DataFrame(np.random.randint(10, size=(100, 3)), columns=['A','B','C'])
result = df.groupby('A').agg({'B': [('D','count'),('E','nunique')],
'C': [('F','first'),('G','max')]})
result.columns = result.columns.get_level_values(1)
print(result)
Кроме того, вы можете сохранить объект groupby
и использовать grouped[col].agg(...)
для создания суб-DataFrames, которые затем могут быть pd.concat
вместе:
import numpy as np
import pandas as pd
np.random.seed(2018)
df = pd.DataFrame(np.random.randint(10, size=(100, 3)), columns=['A','B','C'])
grouped = df.groupby('A')
result = pd.concat([grouped['B'].agg([('D','count'),('E','nunique')]),
grouped['C'].agg([('F','first'),('G','max')])], axis=1)
print(result)
оба фрагмента кода дают следующее (хотя с столбцами, возможно, в другом порядке):
D E F G
A
0 18 8 8 9
1 12 8 6 6
2 14 8 0 8
3 10 9 8 9
4 7 6 3 5
5 8 5 6 7
6 9 7 9 9
7 8 6 4 7
8 8 7 2 9
9 6 5 7 9
В целом, я думаю, что переименование столбцов после факта является самым простым и понятным вариантом.