我有一个如下所示的 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 组合
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