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

Python函数间共享变量时出现DataFrame对象不可调用错误求助

问题分析与解决方法

问题原因

  1. 参数名与全局函数名冲突:SKU_Details函数的参数名用了SAS_full_dataset,但全局存在同名的数据集生成函数SAS_full_dataset()。当你在SKU_Metrics里执行SAS_full_dataset = SAS_full_dataset()后,这个变量已经被覆盖成DataFrame对象,再传入SKU_Details时,函数内部试图调用SAS_full_dataset(),本质是在调用一个DataFrame,自然触发“DataFrame不可调用”的错误。
  2. 数据传递逻辑混乱:你既在函数内部调用生成函数,又试图传入外部生成的DataFrame,两种模式混合导致变量身份混淆,重复生成数据集也会浪费计算资源。
  3. 函数内部变量名不规范:比如SKU_Details=SAS_full_dataset会直接覆盖SKU_Details函数本身,引发潜在的命名冲突。

解决方法

  • 彻底避免参数名与全局函数/变量名重名,用清晰的命名区分数据对象和函数。
  • 统一数据传递逻辑:要么在外部生成完整数据集后传入所有子函数,要么让子函数内部调用生成函数,不要混合两种模式。
  • 规范函数内部变量名,禁止用函数名作为变量名。

修正后的代码示例

1. 修改SKU详情构建函数

def SKU_Details(full_data_df):
    # 直接使用传入的DataFrame,不再重复调用生成函数
    full_data_df = pd.merge(full_data_df, AVG_cost[['SKU','inventory code']], how='left', on='SKU')
    # 原代码重复merge了一次AVG_cost,若为笔误可删除此行
    # full_data_df = pd.merge(full_data_df, AVG_cost[['SKU','inventory code']], how='left', on='SKU')
    
    SKU_Details_df = full_data_df[['Tracking Ln','PCAT','SKU','inventory code']]
    SKU_Details_df['Tracking Ln|PCAT'] = SKU_Details_df['Tracking Ln'] + '|' + SKU_Details_df['PCAT']
    SKU_Details_df = SKU_Details_df.drop_duplicates(subset='SKU')
    return SKU_Details_df

2. 修改SKU指标构建函数

def SKU_Metrics(full_data_df):
    # 直接使用传入的DataFrame,避免重复生成
    full_data_df['Ext. Sell Price'] = full_data_df['Ext. Sell Price'].astype(float)
    # 修正原代码中TTM列名与后续合并的列名不一致问题
    full_data_df['TTM Revenue'] = full_data_df.groupby(['SKU'])['Ext. Sell Price'].transform('sum')
    
    # 调用SKU_Details并传入已处理的数据集
    SKU_Metrics_df = SKU_Details(full_data_df)
    SKU_Metrics_df = pd.merge(SKU_Metrics_df, full_data_df[['SKU','TTM Revenue']], how='left', on='SKU')
    
    # 修正原代码中sort_values+groupby的语法错误
    Historical_SP1['Effective Date'] = pd.to_datetime(Historical_SP1['Effective Date']).dt.strftime('%Y-%m-%d')
    Historical_SP1.sort_values(['Effective Date'], ascending=False, inplace=True)
    current_period_sp1 = Historical_SP1.drop_duplicates(subset='SKU', keep='first')
    
    # 修正np.where的用法错误,改为直接筛选数据
    base_period_sp1 = Historical_SP1[Historical_SP1['Effective Date'].isin(base_period)]
    return SKU_Metrics_df

3. 执行代码

# 先全局生成一次完整数据集
full_dataset = SAS_full_dataset()
# 将数据集传入函数,统一数据流转
SKU_Metrics_result = SKU_Metrics(full_dataset)

内容的提问来源于stack exchange,提问作者padawan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 18:53:20