【发布时间】:2021-12-09 05:38:53
【问题描述】:
我有一个数据框,其中每一行代表产品销售。这些链接到订单号(可以有多个产品),每个订单都有价格和颜色。我需要按订单编号对它们进行分组,并获得一列计算该订单行的每种产品类型。
df = pd.DataFrame({'Product': ['X','X','Y','X','Y','W','W','Z','W','X'],
'Order #': ['01','01','02','03','03','03','04','05','05','05'],
'Price': [100,100,650,50,700,3000,2500,10,2500,150],
'Color': ['RED','BLUE','RED','RED','BLUE','GREEN','RED','BLUE','BLUE','GREEN']})
使用 count 的“常规”分组表达式不是我想要的。
# Aggregate
ag_func = {'Product Quant.': pd.NamedAgg(column='Product', aggfunc='count'),
'Total Price': pd.NamedAgg(column='Price', aggfunc='sum'),
'Color Quant.': pd.NamedAgg(column='Color', aggfunc='count')}
# Test
test = df.groupby(pd.Grouper(key='Order #')).agg(**ag_func).reset_index()
我可以通过对每个类别(产品/颜色)使用 get_dummies 然后使用 sum 聚合函数来解决这个问题。这对于较小的数据集来说很好,但在我的现实世界中,有几十个类别,而且新的集合包含不同的类别......
这是我想出的“解决方案”
# Dummy
df_dummy = pd.get_dummies(df, prefix='Type', prefix_sep=': ', columns=['Product', 'Color'])
ag_func2 = {'Product Quant.': pd.NamedAgg(column='Order #', aggfunc='count'),
'W total': pd.NamedAgg(column='Type: W', aggfunc='sum'),
'X total': pd.NamedAgg(column='Type: X', aggfunc='sum'),
'Y total': pd.NamedAgg(column='Type: Y', aggfunc='sum'),
'Z total': pd.NamedAgg(column='Type: Z', aggfunc='sum'),
'Total Price': pd.NamedAgg(column='Price', aggfunc='sum'),
'Color BLUE': pd.NamedAgg(column='Type: BLUE', aggfunc='sum'),
'Color GREEN': pd.NamedAgg(column='Type: GREEN', aggfunc='sum'),
'Color RED': pd.NamedAgg(column='Type: RED', aggfunc='sum')}
solution = df_dummy.groupby(pd.Grouper(key='Order #')).agg(**ag_func2).reset_index()
注意第 1 行的 2 X 产品和第 5 行的 2 BLUES。这种行为是我需要的,但这对于在多个数据集上重复使用来说太复杂了。我尝试使用 pivot_tables 但没有成功。
我是否应该只定义一个函数来遍历分类列,对这些列进行虚拟化,然后使用虚拟变量的总和聚合对一组列进行分组?
谢谢
【问题讨论】:
标签: python pandas pandas-groupby categories