如何用Pandas按州统计有正销售额的年份占比?
问题描述
现有如下DataFrame:
import pandas as pd import numpy as np df = pd.DataFrame({ 'state': ['CA', 'WA', 'CO', 'AZ'] * 3, 'year': [np.random.randint(2015, 2020) for _ in range(12)], 'sales': [np.random.randint(-100, 100) for _ in range(12)] })
需求:按每个state统计观测到的年份中,销售额为正的年份占比,期望输出类似CA:100%、WA:50%、AZ:67%格式的结果。当前使用的代码仅完成了按state和year聚合销售额:
df.groupby(['state', 'year']).agg({'sales': 'sum'})
解决方案
要实现需求,需要在现有分组聚合的基础上,进一步计算正销售额年份的占比,步骤如下:
按state和year聚合年度总销售额
先确保同一个state同一年的多条销售额记录被合并为总和:yearly_sales = df.groupby(['state', 'year'])['sales'].sum().reset_index()标记正销售额的年份
添加布尔列标记该年份的总销售额是否为正:yearly_sales['is_positive'] = yearly_sales['sales'] > 0计算各state的正销售额年份占比
按state分组后,计算布尔列的均值(布尔值True等价于1,False等价于0,均值即为占比),再转换为百分比格式:ratio_result = yearly_sales.groupby('state')['is_positive'].mean().mul(100).round(1).astype(str) + '%'
完整代码
import pandas as pd import numpy as np # 生成示例DataFrame df = pd.DataFrame({ 'state': ['CA', 'WA', 'CO', 'AZ'] * 3, 'year': [np.random.randint(2015, 2020) for _ in range(12)], 'sales': [np.random.randint(-100, 100) for _ in range(12)] }) # 聚合年度销售额 yearly_sales = df.groupby(['state', 'year'])['sales'].sum().reset_index() # 标记正销售额年份 yearly_sales['is_positive'] = yearly_sales['sales'] > 0 # 计算占比并转为百分比格式 ratio_result = yearly_sales.groupby('state')['is_positive'].mean().mul(100).round(1).astype(str) + '%' # 转换为DataFrame格式输出 result_df = ratio_result.reset_index(name='positive_year_ratio') print(result_df)
示例输出
state positive_year_ratio 0 AZ 66.7% 1 CA 100.0% 2 CO 50.0% 3 WA 33.3%
内容的提问来源于stack exchange,提问作者Felton Wang
相关产品推荐
相关产品推荐

