PCA函数返回DataFrame异常:传入df_2_centered触发NameError
问题修复方案
问题原因
核心问题是判断条件str(1) in str(inputFileName)完全不可靠:
- 你传入的是DataFrame对象而非文件名字符串,将DataFrame转为字符串后会包含数据内容(比如
df_2_centered里的-1.769231包含字符"1"),导致传入df_2_centered时也会进入if分支,else分支从未执行,全局变量df_2_withPCA根本未被定义,因此触发NameError。 - 依赖全局变量本身属于不良编程习惯,会大幅增加调试难度和意外bug的概率。
修改方案
方案1:移除全局变量,直接返回结果(推荐)
完全去掉全局变量,函数处理后直接返回DataFrame,调用时自行接收结果即可,逻辑更清晰:
def performPCA(input_df): pca = PCA() pca.fit(input_df) pca_scores = pca.transform(input_df) df_withPCA = pd.DataFrame(pca_scores) # 添加列名 df_withPCA = df_withPCA.set_axis(['X_coordinate', 'Y_coordinate', 'Z_coordinate'], axis=1) # 保留两位小数 df_withPCA = df_withPCA.round(2) return df_withPCA # 调用示例 df_1_withPCA = performPCA(df_1_centered) df_2_withPCA = performPCA(df_2_centered)
方案2:添加类型参数区分输入(需保留原有变量名逻辑时用)
如果一定要在函数内赋值全局变量,可以添加额外参数明确区分输入类型,彻底避免不可靠的字符串判断:
def performPCA(input_df, df_num): global df_1_withPCA, df_2_withPCA pca = PCA() pca.fit(input_df) pca_scores = pca.transform(input_df) df_withPCA = pd.DataFrame(pca_scores) df_withPCA = df_withPCA.set_axis(['X_coordinate', 'Y_coordinate', 'Z_coordinate'], axis=1) df_withPCA = df_withPCA.round(2) if df_num == 1: df_1_withPCA = df_withPCA return df_1_withPCA else: df_2_withPCA = df_withPCA return df_2_withPCA # 调用示例 performPCA(df_1_centered, 1) performPCA(df_2_centered, 2)
关键提醒
- 永远不要通过将对象转为字符串的方式判断其身份,这种方式极易因数据内容的巧合导致逻辑错误。
- 尽量避免使用全局变量,函数的输入输出应保持清晰独立,降低代码耦合度。
内容的提问来源于stack exchange,提问作者Urvesh
相关产品推荐
相关产品推荐

