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
相关产品推荐
相关产品推荐

