【发布时间】:2020-04-30 15:41:10
【问题描述】:
这是我想要执行的任务,我有大约 7000 个站点和 50 个类别的列表,每个类别每个月都有一个销售计划。我想将此月度计划转换为每日计划并将其与实际情况进行比较并创建一个 Power BI 视觉对象,为此我需要将计划数据转换为每日计划数据。
这里是示例:
df = pd.DataFrame({'ID':[1,2],
'Month':[1,1],
'Plan':[310,620],
'Month_start_date': ['2020-01-01','2020-01-01']})
print(df)
df['Month_start_date'] = (pd.to_datetime(df['Month_start_date'], format='%Y/%m/%d')
.dt.to_period('m').dt.to_timestamp())
df = df.set_index('Month_start_date')
现在我想在每一行上应用的函数返回更多的行数,这里是一个示例:
start = '2020-01-01'
end = '2020-01-05'
dates = pd.date_range(start, end, freq='D')
dates
df= df.reindex(dates,method = 'ffill')
这会返回一个错误,因为索引有重复的值
ValueError: cannot reindex a non-unique index with a method or limit
这是我想要的输出
ID Month Plan
2020-01-01 1 1 310
2020-01-02 1 1 310
2020-01-03 1 1 310
2020-01-04 1 1 310
2020-01-05 1 1 310
2020-01-01 2 1 620
2020-01-02 2 1 620
2020-01-03 2 1 620
2020-01-04 2 1 620
2020-01-05 2 1 620
由于我必须运行它的组合数量约为 800K,实际上在循环上运行它(使用 .iterrows() )需要永远完成并且似乎效率很低。
还尝试使用 .groupby.apply() 函数。但它不允许我为每一行返回一个数据框(表 df)。
改进此过程所需的建议。
【问题讨论】:
-
但是您真的需要create fake daily numbers from spreading the monthly data over
.index.daysinmonth,从而在没有任何额外信息的情况下创建 30 倍以上的记录吗?为什么不直接使用/daysinmonth 呢?除非您向我们展示您需要这样做的理由,否则我认为您不需要它,并且它可以使您的数据框保持紧凑。向我们展示您正在执行的最终计算,不要只是说“我需要在我的表中创建数千个重复行”。 -
当然@smci。我会根据您的建议编辑问题
-
请。向我们展示此代码出现的更高上下文。否则我们就瞎了眼。
-
我已尝试将业务上下文添加到问题中。请让我知道你的想法。
-
很抱歉,但 “我想将此月度计划转换为每日报告。” 将您的数据复制 30 倍似乎不是一个令人信服的理由。如果您的所有代码所做的只是将每月总数除以该月的天数(并且您永远不会有任何实际的真实每日数据),那么为什么不能只显示分子和分母呢? (顺便说一句,您真的想将 1/7 分配到包括周六和周日在内的每一天?而不是像每个工作日或每个非节假日工作日的 1/5?)
标签: python pandas iteration query-optimization