You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 20:02:34