熊猫:使用另一个表的“虚拟变量”创建一个表

时间:2020-02-18 22:04:59

标签: python pandas dataframe

假设我有这个数据框

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 B”获得带有列乘积的“ Dataframe C”:

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()

注意:我在操作的数据框中没有所有数据框A的产品

谢谢

2 个答案:

答案 0 :(得分:2)

您需要将Products中的假人与Operations中的假人进行组合。首先使用前缀定义输出列:

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

然后,像上面一样使用get虚拟变量,但在定义列时使用相同的前缀。按所有共线的列分组,即idcodopervalor。如果这些不是完全共线的,那么您需要确定如何将它们聚合到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

答案 1 :(得分:0)

这是mergepivot_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