Pandas 按降序为每个组创建 % 和 # 分发列表

问题描述 投票:0回答:1

我有一个如下所示的 pandas 数据框

data = {
    'cust_id': ['abc', 'abc', 'abc', 'abc', 'abc', 'abc', 'abc', 'abc', 'abc', 'abc'],
    'product_id': [12, 12, 12, 12, 12, 12, 12, 12, 12, 12],
    'purchase_country': ['India', 'India', 'India', 'Australia', 'Australia', 'Australia', 'Australia', 'Australia', 'Australia', 'Australia']
}
df = pd.DataFrame(data)

我的目标是对每组 cust_id 和 Product_id 执行以下操作

a) 创建两个输出列 - 'pct_region_split' 和 'num_region_split'

b) 对于“pct_region_split” - 存储国家/地区划分的百分比。例如:对于样本数据中显示的特定群体,澳大利亚 - 70%(十分之七是 70%)和印度 - 30%(十分之三是 30%)

c) 对于“num_region_split” - 仅存储国家/地区值的行数。例如:对于示例数据中显示的特定组,澳大利亚 - 总共 10 行中的 7 行,印度是总共 10 行中的 3 行。

b) 以列表格式存储值(降序)。这意味着,澳大利亚应该首先出现,因为它的价值为 70%(高于印度)。

我尝试了以下方法,但没有任何结果

df['total_purchases'] = df.groupby(['cust_id', 'product_id'])['purchase_country'].transform('size')
df['unique_country'] = df.groupby(['cust_id', 'product_id'])['purchase_country'].transform('nunique')

请注意,我的真实数据有超过1000个客户和200个产品组合。

我希望我的输出在一个新的数据框中,如下所示,对于每个 cust 和 Product_id 组合

enter image description here

python pandas dataframe list group-by
1个回答
0
投票

使用自定义函数和

groupby.apply
:

def f(g):
    s = g['purchase_country'].value_counts()
    return pd.Series({'num_region_split': ', '.join(s.index+':'+s.astype('str')),
                      'pct_region_split': ', '.join(s.index+':'+s.div(s.sum()).astype('str')),
                     })

df.groupby(['cust_id', 'product_id'], as_index=False).apply(f)

输出:

  cust_id  product_id      num_region_split          pct_region_split
0     abc          12  Australia:7, India:3  Australia:0.7, India:0.3
© www.soinside.com 2019 - 2024. All rights reserved.