#python #pandas #dataframe
Вопрос:
У меня есть два фрейма данных. Я хотел бы провести некоторый анализ, используя эти две таблицы. Я думал использовать соединения, но это не сработало. Отсюда и обращение за помощью. Позвольте мне подробно изложить проблему с помощью данных. Эти данные не являются полными данными, просто для понимания цели я создал эти примеры данных. На самом деле размеры данных велики.
У меня есть две таблицы входных данных.
Таблица 1:
Месяц | Область | Код состояния | Имя состояния |
---|---|---|---|
Янв. | 101 | TX01 | Итого страна |
Февраль | 101 | TX01 | Итого страна |
Февраль | 101 | TX04 | Юг |
Янв. | 102 | TX01 | Итого страна |
Февраль | 102 | TX01 | Итого страна |
Февраль | 102 | TX06 | Север |
Февраль | 102 | TX12 | Мумбаи |
Здесь следует отметить, что область «101» сопоставляется с именем штата «Total_Country» дважды, потому что у нас есть два месяца — январь и февраль. Но область «101» сопоставляется с именем штата «Юг» только один раз, потому что она активна только с месяца «Февраль».
Таблица 2:
Месяц | Область | Бренд | Цена | Продажи |
---|---|---|---|---|
Янв. | 101 | Прижаться | 14 | 300 |
Янв. | 101 | Unilever | 15 | 380 |
Февраль | 101 | Азбука | 10 | 320 |
Февраль | 101 | Прижаться | 14 | 420 |
Февраль | 101 | Unilever | 15 | 500 |
Янв. | 102 | Прижаться | 15 | 310 |
Янв. | 102 | Unilever | 16 | 390 |
Февраль | 102 | Прижаться | 15 | 430 |
Февраль | 102 | Unilever | 16 | 510 |
Это данные об уровне бренда за каждый месяц в отдельной области.
Таблица выходных данных: Выходные данные должны содержать Сумму(Цена) и Сумму(Продаж) за месяц * Код состояния * Имя состояния * Бренд.
Месяц | Код состояния | Имя состояния | Бренд | Цена | Продажи |
---|---|---|---|---|---|
Янв. | TX01 | Итого страна | Прижаться | 29 | 610 |
Янв. | TX01 | Итого страна | Unilever | 31 | 770 |
Февраль | TX01 | Итого страна | Азбука | 10 | 320 |
Февраль | TX01 | Итого страна | Прижаться | 29 | 850 |
Февраль | TX01 | Итого страна | Unilever | 31 | 1010 |
Февраль | TX04 | Юг | Азбука | 10 | 320 |
Февраль | TX04 | Юг | Прижаться | 14 | 420 |
Февраль | TX04 | Юг | Unilever | 15 | 500 |
Февраль | TX06 | Север | Прижаться | 15 | 430 |
Февраль | TX06 | Север | Unilever | 16 | 510 |
Февраль | TX12 | Мумбаи | Прижаться | 15 | 430 |
Февраль | TX12 | Мумбаи | Unilever | 16 | 510 |
Заранее спасибо за помощь..!
Комментарии:
1. Какой код вы опробовали?
2. Как я уже упоминал в самом вопросе, я применил перекрестное соединение / vlookup(функция карты), но результат, который я получаю, не является желаемым результатом. Здесь, помимо кода, я думаю, что очень важна логика, которую я изо всех сил пытаюсь понять.
3. зачем вам здесь понадобилось перекрестное соединение? что плохого в двухэтапном слиянии, а затем в групповом объединении?
Ответ №1:
Попробуйте merge
затем создать сводные значения с помощью groupby sum
:
new_df = (
df1.merge(df2)
.drop('Area', 1)
.groupby(['Month', 'State_Code', 'State_Name', 'Brand'],
as_index=False, sort=False)
.sum()
)
new_df
:
Month State_Code State_Name Brand Price Sales
0 Jan TX01 Total_Country Nestle 29 610
1 Jan TX01 Total_Country Unilever 31 770
2 Feb TX01 Total_Country Abc 10 320
3 Feb TX01 Total_Country Nestle 29 850
4 Feb TX01 Total_Country Unilever 31 1010
5 Feb TX04 South Abc 10 320
6 Feb TX04 South Nestle 14 420
7 Feb TX04 South Unilever 15 500
8 Feb TX06 North Nestle 15 430
9 Feb TX06 North Unilever 16 510
10 Feb TX12 Mumbai Nestle 15 430
11 Feb TX12 Mumbai Unilever 16 510
Ответ №2:
Вы можете выполнить a pd.merge()
с несколькими столбцами, чтобы это было слияние/объединение с двумя ключами.
редактировать: вам также понадобится drop()
столбец «область»
df3 = pd.merge(df1,df2,on=['Month','Area']).drop('Area',axis=1)
output = df3.groupby(['Month','State_Code','State_Name','Brand'],as_index=False,sort=False).sum()
df3
Month Area State_Code State_Name Brand Price Sales
0 Jan 101 TX01 Total_Country Nestle 14 300
1 Jan 101 TX01 Total_Country Unilever 15 380
2 Feb 101 TX01 Total_Country Abc 10 320
3 Feb 101 TX01 Total_Country Nestle 14 420
4 Feb 101 TX01 Total_Country Unilever 15 500
5 Feb 101 TX04 South Abc 10 320
6 Feb 101 TX04 South Nestle 14 420
7 Feb 101 TX04 South Unilever 15 500
8 Jan 102 TX01 Total_Country Nestle 15 310
9 Jan 102 TX01 Total_Country Unilever 16 390
10 Feb 102 TX01 Total_Country Nestle 15 430
11 Feb 102 TX01 Total_Country Unilever 16 510
12 Feb 102 TX06 North Nestle 15 430
13 Feb 102 TX06 North Unilever 16 510
14 Feb 102 TX12 Mumbai Nestle 15 430
15 Feb 102 TX12 Mumbai Unilever 16 510
output
Month State_Code State_Name Brand Area Price Sales
0 Jan TX01 Total_Country Nestle 203 29 610
1 Jan TX01 Total_Country Unilever 203 31 770
2 Feb TX01 Total_Country Abc 101 10 320
3 Feb TX01 Total_Country Nestle 203 29 850
4 Feb TX01 Total_Country Unilever 203 31 1010
5 Feb TX04 South Abc 101 10 320
6 Feb TX04 South Nestle 101 14 420
7 Feb TX04 South Unilever 101 15 500
8 Feb TX06 North Nestle 102 15 430
9 Feb TX06 North Unilever 102 16 510
10 Feb TX12 Mumbai Nestle 102 15 430
11 Feb TX12 Mumbai Unilever 102 16 510