You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 02:57:07