#python #pandas #list #loops
#python #pandas #Список #циклы
Вопрос:
Я работаю над набором данных, который позволит мне оценивать различные модели поведения клиентов. Для этого я читаю несколько файлов Excel в список, прежде чем объединять их в один фрейм данных. Однако перед этим шагом я хочу создать несколько новых столбцов в каждом из них, чтобы суммировать доход в зависимости от года и продукта, аналогично приведенному ниже:
Входные данные
| |Year |Customer |Product |PO |Revenue |
| |:--------|:--------|:--------|:--------|:--------|
|0| 2019 | Cust 1 | DIGITAL | P1 | 100 |
|1| 2020 | Cust 1 | DIGITAL | P2 | 120 |
|2| 2019 | Cust 2 | STORE | P3 | 240 |
|3| 2019 | Cust 1 | DIGITAL | P4 | 200 |
|4| 2019 | Cust 2 | DIGITAL | P5 | 110 |
|5| 2020 | Cust 2 | STORE | P6 | 100 |
|6| 2020 | Cust 3 | DIGITAL | P7 | 120 |
|7| 2020 | Cust 3 | STORE | P8 | 180 |
Желаемый результат
| |Year |Customer |Product |PO |Revenue |19 Total |20 Total |19 Dig |20 Dig |19 Store |20 Store
| |:--------|:--------|:--------|:--------|:--------|:--------|:--------|:--------|:--------|:--------|:--------
|0| 2019 | Cust 1 | DIGITAL | P1 | 100 | 100 | | 100 | | |
|1| 2020 | Cust 1 | DIGITAL | P2 | 120 | | 120 | | 120 | |
|2| 2019 | Cust 2 | STORE | P3 | 240 | 240 | | | | 240 |
|3| 2019 | Cust 1 | DIGITAL | P4 | 200 | 200 | | 200 | | |
|4| 2019 | Cust 2 | DIGITAL | P5 | 110 | 110 | | 110 | | |
|5| 2020 | Cust 2 | STORE | P6 | 100 | | 100 | | | | 100
|6| 2020 | Cust 3 | DIGITAL | P7 | 120 | | 120 | | 120 | |
|7| 2020 | Cust 3 | STORE | P8 | 180 | | 180 | | | | 180 |
Таким образом, в основном каждый год будет иметь свой годовой итог, а также сумму дохода по категории продукта. Обратите внимание, что теперь необходимо поддерживать порядок столбцов или строк.
Любая помощь, которую вы можете оказать, будет отличной — дайте мне знать, если что-то не имеет смысла.
РЕДАКТИРОВАТЬ При работе с несколькими вариантами я обнаружил, что приведенный ниже код работает, но я уверен, что есть более чистый способ его написания, если кто-нибудь может помочь?
df_2019 = df.loc[df['Year'] == 2019]
df_2020 = df.loc[df['Year'] == 2020]
df_list = [df_2019, df_2020]
for i in df_list:
i[str(i['Year'].min()) ' Total Rev'] = i['Revenue']
i[str(i['Year'].min()) ' Dig Rev'] = i.loc[i['Product'] == 'DIGITAL', 'Revenue']
i[str(i['Year'].min()) ' Store Rev'] = i.loc[i['Product'] == 'STORE', 'Revenue']
df_combined = pd.concat(df_list).sort_index()
df_combined
Ответ №1:
Мы можем pivot_table
дважды, затем сгладить ваш мультииндекс с помощью понимания списка и, наконец, использовать pd.concat
для создания вашего окончательного фрейма данных:
piv1 = df.pivot_table(
index=["PO"],
columns='Year',
values="Revenue"
).reset_index(drop=True).add_suffix(" Total")
piv2 = df.pivot_table(
index=["PO"],
columns=["Year", "Product"],
values="Revenue"
).reset_index(drop=True)
piv2.columns = [f"{c1} {c2}" for c1, c2 in piv2.columns]
df = pd.concat([df, piv1, piv2], axis=1)
Year Customer Product PO Revenue 2019 Total 2020 Total 2019 DIGITAL
0 2019 Cust 1 DIGITAL P1 100 100.0 NaN 100.0
1 2020 Cust 1 DIGITAL P2 120 NaN 120.0 NaN
2 2019 Cust 2 STORE P3 240 240.0 NaN NaN
3 2019 Cust 1 DIGITAL P4 200 200.0 NaN 200.0
4 2019 Cust 2 DIGITAL P5 110 110.0 NaN 110.0
5 2020 Cust 2 STORE P6 100 NaN 100.0 NaN
6 2020 Cust 3 DIGITAL P7 120 NaN 120.0 NaN
7 2020 Cust 3 STORE P8 180 NaN 180.0 NaN
2019 STORE 2020 DIGITAL 2020 STORE
0 NaN NaN NaN
1 NaN 120.0 NaN
2 240.0 NaN NaN
3 NaN NaN NaN
4 NaN NaN NaN
5 NaN NaN 100.0
6 NaN 120.0 NaN
7 NaN NaN 180.0
Комментарии:
1. Спасибо, Эрфан, спасибо, что вы вернулись ко мне по этому поводу — проблема, с которой я столкнулся, заключается в том, что мой основной набор данных на самом деле составляет около 70 столбцов, и, хотя мне не нужно сохранять порядок, мне нужно убедиться, что все они включены