在 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 倍以上的记录吗?为什么不直接使用 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() 中为标题设置字体大小?