Pandas如何将含区域年度目标的DataFrame拆分为月度目标
方案1:index.repeat实现(兼容性最优,全pandas版本可用)
不需要创建辅助月度表,也不需要做笛卡尔积合并,代码如下:
import pandas as pd df = pd.DataFrame.from_records(data=[['region1',60000],['region2',120000]], columns=['region','goal']) # 每行重复12次对应12个月 df = df.loc[df.index.repeat(12)].reset_index(drop=True) # 生成月度序列 df['month'] = df.index % 12 + 1 # 计算月度目标 df['goal'] = (df['goal'] / 12).astype(int)
方案2:explode实现(代码最精简,要求pandas≥0.25.0)
利用列表列炸开的特性直接生成月度字段,代码如下:
import pandas as pd df = pd.DataFrame.from_records(data=[['region1',60000],['region2',120000]], columns=['region','goal']) # 先给每行赋值完整的12个月份列表 df['month'] = [list(range(1, 13))] * len(df) # 炸开列表列得到每月数据 df = df.explode('month', ignore_index=True) # 计算月度目标 df['goal'] = (df['goal'] / 12).astype(int)
两种方案最终输出结果和你当前实现的结果完全一致,对比cross merge的写法更精简,也避免了额外的合并操作,数据量较大时性能更好。
内容的提问来源于stack exchange,提问作者Bera
相关产品推荐
相关产品推荐

