假设我有这个数据框
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的产品
谢谢
答案 0 :(得分:2)
您需要将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
答案 1 :(得分:0)
这是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