如何用Python对DataFrame的字符串值执行Pivot并计算达成率?
解决Pandas DataFrame按日期计算Achieved占比的问题
嘿,我懂你想要实现的效果——就像Excel里按日期做透视表,统计每天Achieved结果的占比对吧?其实不用纠结复杂的pivot操作,用Pandas的groupby或者crosstab就能轻松搞定,我给你一步步拆解:
第一步:构造样本数据
先把你提供的样本数据转换成Pandas DataFrame:
import pandas as pd data = { 'Date report': ['01/11/2020', '01/11/2020', '02/11/2020', '02/11/2020', '02/11/2020', '03/11/2020'], 'Result': ['Achieved', 'Achieved', 'Failed', 'Failed', 'Achieved', 'Achieved'] } df = pd.DataFrame(data)
第二步:计算每日Achieved占比
这里有两种简单的实现方式:
方法一:用groupby+agg组合计算
先按日期分组,然后统计每组里Achieved的数量和总数量,再做除法得到占比:
# 按日期分组,计算Achieved的数量和总数量 grouped = df.groupby('Date report').agg( achieved_count=('Result', lambda x: (x == 'Achieved').sum()), total_count=('Result', 'count') ) # 计算占比并格式化,然后重置索引得到目标格式 result_df = grouped.assign( Result=lambda x: (x['achieved_count'] / x['total_count']).map('{:.2%}'.format) ).reset_index()[['Date report', 'Result']] print(result_df)
方法二:用crosstab快速统计
pd.crosstab可以直接生成交叉表,然后计算行占比:
# 生成日期和Result的交叉表 cross_tab = pd.crosstab(df['Date report'], df['Result']) # 计算Achieved的占比,格式化后重置索引 result_df = cross_tab.assign( Result=lambda x: (x['Achieved'] / x.sum(axis=1)).map('{:.2%}'.format) ).reset_index()[['Date report', 'Result']] print(result_df)
运行结果
两种方法都会输出你想要的格式:
Date report Result 0 01/11/2020 100.00% 1 02/11/2020 33.33% 2 03/11/2020 100.00%
简单说下逻辑:两种方法的核心都是先按日期分组统计,再计算Achieved数量与总数量的比值,最后用map('{:.2%}'.format)把小数转换成带两位小数的百分比格式,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者Salmannn
相关产品推荐
相关产品推荐

