我正在使用熊猫数据框。我有datafreme像:
df
COUNTRY LINE PRODUCT SERVICE
Argelia 1 1.0 Mobile
Argelia 1 2.0 Mobile
Argelia 1 3.0 Mobile
Argelia 2 1.0 Mobile
Argelia 3 2.0 Mobile
Argelia 3 3.0 Mobile
我想按LINE分组并旋转PRODUCT列,但是我需要4个产品列(product_1,product_2,product_3和product_4),它不在乎是否有PRODUCT值= 4。
我正在尝试使用get_dummies
以下代码:
df = pd.concat([df, pd.get_dummies(dfs['PRODUCT'], prefix='product')], axis=1)
df.drop(['PRODUCT'], axis=1, inplace=True)
df = df.groupby(['COUNTRY', 'LINE', 'SERVICE']).agg({'product_1' : np.max, 'product_2': np.max, 'product_3':np.max, 'product_4':np.max}).reset_index()
但是它只给我3列产品,我希望4列具有此数据框:
COUNTRY LINE SERVICE product_1 product_2 product_3 product_4
Argelia 1 Mobile 1 1 1 0
Argelia 2 Mobile 1 0 0 0
Argelia 3 Mobile 0 1 1 0
可能吗?
(我也需要将PRODUCT值类型从1.0更改为1)
使用DataFrame.reindex
与所有可能的产品的新栏目,这里是另一种解决方案,希望以更快DataFrame.pivot_table
,DataFrame.clip
获得最大1
价值,rename
为转换浮动列整数,DataFrame.add_prefix
且reindex
:
cols = [f'product_{i}' for i in range(1, 5)]
df1 = (df.pivot_table(index=['COUNTRY', 'LINE', 'SERVICE'],
columns='PRODUCT',
fill_value=0,
aggfunc='size')
.clip(upper=1)
.rename(columns=int)
.add_prefix('product_')
.reindex(cols, axis=1, fill_value=0))
print (df1)
PRODUCT product_1 product_2 product_3 product_4
COUNTRY LINE SERVICE
Argelia 1 Mobile 1 1 1 0
2 Mobile 1 0 0 0
3 Mobile 0 1 1 0
在您的DataFrame.pop
用于提取列的解决方案中,转换为整数,然后通过进行聚合max
并添加reindex
:
df = pd.concat([df, pd.get_dummies(df.pop('PRODUCT').astype(int),prefix='product')], axis=1)
cols = [f'product_{i}' for i in range(1, 5)]
df = df.groupby(['COUNTRY', 'LINE', 'SERVICE']).max().reindex(cols, axis=1, fill_value=0)
print (df)
product_1 product_2 product_3 product_4
COUNTRY LINE SERVICE
Argelia 1 Mobile 1 1 1 0
2 Mobile 1 0 0 0
3 Mobile 0 1 1 0
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句