Python函数间共享变量时出现DataFrame对象不可调用错误求助
问题分析与解决方法
问题原因
- 参数名与全局函数名冲突:
SKU_Details函数的参数名用了SAS_full_dataset,但全局存在同名的数据集生成函数SAS_full_dataset()。当你在SKU_Metrics里执行SAS_full_dataset = SAS_full_dataset()后,这个变量已经被覆盖成DataFrame对象,再传入SKU_Details时,函数内部试图调用SAS_full_dataset(),本质是在调用一个DataFrame,自然触发“DataFrame不可调用”的错误。 - 数据传递逻辑混乱:你既在函数内部调用生成函数,又试图传入外部生成的DataFrame,两种模式混合导致变量身份混淆,重复生成数据集也会浪费计算资源。
- 函数内部变量名不规范:比如
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
相关产品推荐
相关产品推荐

