Pandas: создать таблицу с фиктивной переменной другой таблицы - PullRequest
4 голосов
/ 19 февраля 2020

Допустим, у меня есть эти фреймы данных

DataFrame A (Продукты)

Cod | Product   | Cost | Date
-------------------------------
18  | Product01 | 3.4  | 21/04
22  | Product02 | 7.2  | 12/08
33  | Product03 | 8.4  | 17/01
55  | Product04 | 0.6  | 13/07
67  | Product05 | 1.1  | 09/09

DataFrame B (Операции)

id | codoper | CodProd  | valor
-------------------------------
1  | 00001   | 55       | 45000
2  | 00001   | 18       | 45000
3  | 00002   | 33       | 53000
1  | 00001   | 55       | 45000

Идея заключается в получении "dataframe C "с продуктом столбца из" Dataframe B ":

DataFrame C Результат

id | codoper | Product_18| Product_22| Product_33| Product_55| Product_67 |valor
----------------------------------------------------------------------------------
1  | 00001   | 1         | 0         | 0         | 1         | 0          |45000
2  | 00002   | 0         | 0         | 1         | 0         | 0          |53000

Пока мне удалось сделать это только из" DataFrame B ":

pd.get_dummies(df, columns=['CodProd']).groupby(['codoper'], as_index=False).min()

Примечание. У меня не все продукты из Дайджеста А в Дате операций

спасибо

Ответы [ 2 ]

2 голосов
/ 19 февраля 2020

Вам нужно объединить манекены из Products с манекенами из Operations. Начните с определения выходных столбцов с помощью префикса:

columns = ['id', 'codoper'] + [f"Product_{cod}" for cod in A['Cod'].unique()] + ['valor']

Затем используйте get-макеты, как вы делали выше, но используйте тот же префикс для определения столбцов. Сгруппируйте по все столбцы, которые идеально коллинеарны , то есть id, codoper и valor. Если они не совсем коллинеарны, вам нужно решить, как их агрегировать до уровня codoper. Наконец, переиндексируйте, используя выходные столбцы, которые вы ранее определили, заполняя недостающие значения нулем.

pd.get_dummies(B, columns=['CodProd'], prefix='Product').groupby(['id', 'codoper', 'valor'], as_index=False).sum().reindex(columns=columns, fill_value=0) 
  id codoper  Product_18  Product_22  Product_33  Product_55  Product_67  valor
0  1   00001           0           0           0           2           0  45000
1  2   00001           1           0           0           0           0  45000
2  3   00002           0           0           1           0           0  53000
0 голосов
/ 19 февраля 2020

Это комбинация merge и pivot_table с некоторыми настройками:

(Products.merge(Operations, 
                left_on='Cod', 
                right_on='CodProd',
                how='left')
     .pivot_table(index=['codoper','valor'],
                  values='Product',
                  columns='Cod', 
                  fill_value=0,
                  aggfunc='any')
     .reindex(Products.Cod.unique(), 
              fill_value=False,
              axis=1)
     .astype(int)
     .add_prefix('Product_')
     .reset_index()
)

Вывод:

Cod codoper    valor  Product_18  Product_22  Product_33  Product_55  \
0     00001  45000.0           1           0           0           1   
1     00002  53000.0           0           0           1           0   

Cod  Product_67  
0             0  
1             0  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...