Обобщите данные, используя два фрейма данных Python

#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