Python 为数据帧中的每一行返回多行

Python 为数据帧中的每一行返回多行,python,pandas,iteration,query-optimization,Python,Pandas,Iteration,Query Optimization,下面是我要执行的任务,我有大约7000个站点和50个类别的列表,每个类别每个月都有一个销售计划。我想将这个月计划转换为每日计划,并将其与实际值进行比较,并创建一个power BI visual,为此我需要将计划数据转换为每日计划 以下是示例: df = pd.DataFrame({'ID':[1,2], 'Month':[1,1], 'Plan':[310,620], 'Month_st

下面是我要执行的任务,我有大约7000个站点和50个类别的列表,每个类别每个月都有一个销售计划。我想将这个月计划转换为每日计划,并将其与实际值进行比较,并创建一个power BI visual,为此我需要将计划数据转换为每日计划

以下是示例:

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)

需要改进这一进程的建议

sort_values()函数有望实现您想要的功能:

df.sort\u值(by=df.index,inplace=True)


或者,如果您的日期有一个列名,您只需将其更改为df的列名,您甚至可以将其与groupby配对,以便仅为某些已排序的组创建数据帧,因为您的数据集非常大。我希望这有点帮助

谢谢你回答Marcos,我发现了这个错误。KeyError:DatetimeIndex(['2020-01-01','2020-01-01'],dtype='datetime64[ns]',name='Month\u start\u date',freq=None)-基本上是检查重复错误。此外,我不明白解决方案,你能再进一步解释一下吗?但你真的需要,从而在没有任何额外信息的情况下,创建30倍以上的记录吗?为什么不直接使用/daysinmonth呢?除非你给我们一个你需要的理由,否则我认为你不需要它,而且它可以让你的数据框紧凑。向我们展示您正在执行的最终计算,不要只说“我需要在我的表中创建数千个重复行”。当然@smci。我会根据你的建议编辑这个问题是的,请。向我们展示此代码发生的更高上下文。否则,我们就盲目地工作。我试图在这个问题上添加商业背景。请务必让我知道您的想法。很抱歉,“我想将此月度计划转换为每日报告。”这似乎不是将您的数据复制30倍的有力理由。如果你的代码所做的只是将一个月的总数除以该月的天数(而且你永远不会有任何实际的每日数据),为什么你不能只显示分子和分母呢?(顺便问一下,你真的想在周末的每一天(包括周六和周日)分配1/7吗?不是每个工作日或非假日工作日分配1/5吗?)