如何将cohort队列数据分解转换为所需的时间序列格式?
解决方法
直接使用pandas自带的宽表转长表函数melt即可完成需求,无需手动编写循环,代码简洁且效率更高:
核心思路
- 将存储偏移天数的列(0-5)从列名转换为单独的偏移天数字段
- 计算实际日期 = 队列起始日期 + 偏移天数
- 最后保留所需的两个字段即可
示例代码
import pandas as pd # 第一步:宽表转长表 long_df = df.melt( id_vars="Cohort Day", # 保留队列起始日期列作为标识列 var_name="offset_day", # 原列名(0-5)转为偏移天数字段 value_name="value" # 原单元格值转为数值字段 ) # 第二步:转换偏移天数为整数,计算实际日期 long_df["offset_day"] = long_df["offset_day"].astype(int) long_df["actual_date"] = long_df["Cohort Day"] + pd.to_timedelta(long_df["offset_day"], unit="d") # 第三步:提取所需两列得到最终结果 result = long_df[["actual_date", "value"]]
原有代码的错误原因
- 初始化的
test是空DataFrame,遍历itertuples()时没有可迭代的行对象,循环内的代码完全不会执行,自然test一直为空 test[0:5, 0]这类索引写法不符合pandas的基础语法,pandas默认会将(0:5, 0)识别为元组类型的列名,而非你预期的「行切片+按位置取列」赋值- apply内的逻辑存在语法错误,lambda返回的是生成器对象,无法得到正确的偏移天数数值
内容的提问来源于stack exchange,提问作者Vladislava Gonchar
相关产品推荐
相关产品推荐

