如何用Pandas实现DataFrame每行多计算并展开结果?
解决方法
我来帮你实现这个需求!你想要把原DataFrame的每一行,根据total列的值生成多个计算行,最终扩展成包含calculation id和result的新DataFrame,对吧?下面是高效的实现方式,比iterrows更贴合Pandas的风格:
完整代码示例
import pandas as pd import numpy as np # 初始化原DataFrame df = pd.DataFrame({ 'date': ['31/12/2015','31/12/2016','31/12/2017','31/12/2018', '31/12/2019','31/12/2020','31/12/2015','31/12/2016', '31/12/2017','31/12/2018','31/12/2019','31/12/2020'], 'season': ['S1','S1','S1','S1','S1','S1','S2','S2','S2','S2','S2','S2'], 'total' : [1,0,0,0,0.022313421,0.053791041,0,0,0.307783314,0,0,0] }) df.date = pd.to_datetime(df.date) def expand_row(row): # 生成从0到total的6个等分点(对应6次计算) linspace_vals = np.linspace(0, row['total'], 6) # 构建扩展后的行数据 expanded_data = { 'calculation id': range(1, 7), # 计算ID从1到6 'result': linspace_vals * 5 # 你的计算逻辑:每个值乘以5 } expanded_df = pd.DataFrame(expanded_data) # 将原行的基础字段(date/season/total)复制到每一行 expanded_df[['date', 'season', 'total']] = row[['date', 'season', 'total']] # 调整列顺序匹配你需要的格式 return expanded_df[['date', 'season', 'total', 'calculation id', 'result']] # 对原DataFrame的每一行应用扩展函数,合并所有结果 final_df = df.apply(expand_row, axis=1).reset_index(drop=True) # 查看前6行(对应原第一行的扩展结果) print(final_df.head(6))
代码说明
- 高效的行扩展方式:使用
df.apply(axis=1)替代iterrows,因为apply是Pandas的向量化操作,在大数据集上运行速度更快。 - 生成等分计算值:用
np.linspace(0, row['total'], 6)生成从0到当前行total值的6个均匀分布的数值,对应6次计算。 - 构建扩展DataFrame:为每个等分值创建包含
calculation id和result的小DataFrame,再把原行的date、season、total字段复制到每一行。 - 格式调整:最后调整列的顺序,确保和你期望的输出格式一致。
适配示例的5行版本
如果你的示例里只需要5行计算(比如从total/5到total),可以修改linspace的部分,去掉初始的0值:
def expand_row(row): # 生成从total/5到total的5个等分点(对应5次计算) linspace_vals = np.linspace(0, row['total'], 6)[1:] # 去掉第一个0值 expanded_data = { 'calculation id': range(1, 6), # 计算ID从1到5 'result': linspace_vals * 5 } expanded_df = pd.DataFrame(expanded_data) expanded_df[['date', 'season', 'total']] = row[['date', 'season', 'total']] return expanded_df[['date', 'season', 'total', 'calculation id', 'result']]
这样运行后,原第一行的扩展结果就和你给出的示例完全一致了。
内容的提问来源于stack exchange,提问作者Peslier53
相关产品推荐
相关产品推荐

