在 Pandas 中为 DataFrame 中的每一行返回多行

Posted

技术标签:

【中文标题】在 Pandas 中为 DataFrame 中的每一行返回多行【英文标题】:Return multiple rows for every row in a DataFrame in Pandas 【发布时间】: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?) 【参考方案1】:

sort_values() 函数有望实现您的目标:

df.sort_values(by=df.index, inplace =True)

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

【讨论】:

感谢您回答 Marcos,我收到此错误。 KeyError: DatetimeIndex(['2020-01-01', '2020-01-01'], dtype='datetime64[ns]', name='Month_start_date', freq=None) - 基本上是检查重复错误。另外,我不明白解决方案,你能再解释一下吗?

以上是关于在 Pandas 中为 DataFrame 中的每一行返回多行的主要内容,如果未能解决你的问题,请参考以下文章

pandas使用isna函数和any函数判断dataframe中的每一个数据列中是否包含缺失值

将一个 pandas DataFrame 的副本合并到另一个 DataFrame 的每一行中?

如何在 pandas.DataFrame.plot() 中为标题设置字体大小?

在 Pandas 中为列名包含模式的多列过滤 DataFrame

如何在pandas dataframe中为新列添加值?

在 Pandas Dataframe 中为字符串添加前导零