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

Python Pandas:按日期分组统计ISCONVERTED字段0/1值占比并输出指定格式的问题求助

解决按日期分组计算转换状态占比的问题

我明白你想要的是每个日期对应1-2条记录(两种状态都存在时显示两条),分别展示ISCONVERTED=1和ISCONVERTED=0的占比。你当前用的value_counts(normalize=True)其实已经算出了正确的占比,但问题在于它返回的是多级索引的Series,不是你需要的扁平DataFrame结构;而且如果某个日期只有一种状态(比如全是1),它不会生成另一种状态的占比记录。

下面给你两种可行的解决方法:

方法1:基于现有代码调整格式

如果想沿用你原有的计算逻辑,只需要把得到的Series转换成DataFrame并重置索引,再调整列名即可:

import pandas as pd

# 执行你的原代码,计算各状态占比
ratio_series = df.groupby(['CREATEDDATE'])['ISCONVERTED'].value_counts(normalize=True)

# 转换为DataFrame,重置索引并重命名占比列
result_df = ratio_series.reset_index(name='CONVERSION_RATIO')

# 可选:按你的目标格式重命名列(注意这里列值是占比,建议保留清晰列名)
result_df = result_df.rename(columns={'CONVERSION_RATIO': 'ISCONVERTED'})

这个方法简单直接,和你给出的目标格式完全匹配——如果某个日期只有一种状态(比如01 January 21全是1),只会生成一行占比为1.0的记录。

方法2:确保所有状态都有记录(含0占比)

如果你希望不管某个日期是否存在某类状态,都能显示对应的占比(比如0的占比为0),可以用pd.crosstab实现,再转成长表:

import pandas as pd

# 生成交叉表,按日期计算各状态的占比
cross_tab = pd.crosstab(df['CREATEDDATE'], df['ISCONVERTED'], normalize='index')

# 把宽表转成长表,匹配每行一条记录的格式
result_df = cross_tab.reset_index().melt(
    id_vars='CREATEDDATE', 
    var_name='ISCONVERTED', 
    value_name='CONVERSION_RATIO'
)

# 可选:去掉占比为0的记录,和目标格式保持一致
result_df = result_df[result_df['CONVERSION_RATIO'] > 0]

# 可选:按你的目标格式重命名列
result_df = result_df.rename(columns={'CONVERSION_RATIO': 'ISCONVERTED'})

这样处理后,你就能得到符合需求的结果:每个日期对应1-2条记录,分别展示对应状态的占比。

内容的提问来源于stack exchange,提问作者Ib D

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 14:57:45