基于DataFrame行值关联生成新DataFrame的代码优化需求
优化DataFrame合并实现方案
现有代码可正常运行,但需更优实现方案,需求为将初始DataFrame与依赖其行值生成的另一个DataFrame合并。
原代码及输出
原代码
import pandas as pd def getdf(x): df2 = pd.DataFrame( {'rkey': ['X', 'Y', 'Z'], 'rval': [x, x*2, x*3]}) return df2 def combine(df): data = [] dfout = pd.DataFrame() for i in range(len(df)): df1 = df.iloc[i, :].to_frame().transpose().reset_index() df2 = getdf(df1['lval'].values[0]) df3 = df1.join(df2, how='outer',lsuffix='', rsuffix='') dfout = pd.concat([dfout,df3],axis=0,ignore_index=True) dfout = dfout[dfout.columns.drop('index')] return dfout df1 = pd.DataFrame( {'key': ['A','B','C'], 'lval': [1,3,5]}) print(combine(df1))
原输出
key lval rkey rval 0 A 1 X 1 1 NaN NaN Y 2 2 NaN NaN Z 3 3 B 3 X 3 4 NaN NaN Y 6 5 NaN NaN Z 9 6 C 5 X 5 7 NaN NaN Y 10 8 NaN NaN Z 15
优化方案
原代码通过循环遍历每行并多次concat实现,效率较低(尤其数据量大时),以下两种方案更高效且简洁:
方案一:利用apply+explode扩展行
import pandas as pd def generate_expanded_rows(row): x = row['lval'] return [{'rkey': 'X', 'rval': x}, {'rkey': 'Y', 'rval': x*2}, {'rkey': 'Z', 'rval': x*3}] df1 = pd.DataFrame( {'key': ['A','B','C'], 'lval': [1,3,5]}) # 为每行生成对应的扩展数据列表 df1['expanded_data'] = df1.apply(generate_expanded_rows, axis=1) # 将列表展开为独立行 df_out = df1.explode('expanded_data').reset_index(drop=True) # 将字典列拆分为单独字段 df_out = pd.concat([df_out.drop('expanded_data', axis=1), df_out['expanded_data'].apply(pd.Series)], axis=1) print(df_out)
方案二:交叉连接+矢量化计算(性能最优)
此方案完全避免循环,利用pandas矢量化操作,适合大数据场景:
import pandas as pd df1 = pd.DataFrame( {'key': ['A','B','C'], 'lval': [1,3,5]}) # 定义rkey与对应的乘数 r_base = pd.DataFrame({'rkey': ['X', 'Y', 'Z'], 'multiplier': [1, 2, 3]}) # 交叉连接原DataFrame与r_base df_out = df1.assign(temp=1).merge(r_base.assign(temp=1), on='temp').drop('temp', axis=1) # 计算rval列 df_out['rval'] = df_out['lval'] * df_out['multiplier'] # 移除临时乘数列 df_out = df_out.drop('multiplier', axis=1) print(df_out)
优化说明
- 原方案循环遍历每行并反复
concat,会频繁创建新DataFrame,性能损耗明显; - 方案一通过
apply批量生成扩展数据,再用explode展开,比循环更高效,代码更简洁; - 方案二采用交叉连接+矢量化计算,是pandas推荐的高效操作模式,性能最优,且逻辑清晰易维护。
内容的提问来源于stack exchange,提问作者lucky1928
相关产品推荐
相关产品推荐

