我正在尝试使用 Intersection() 合并三个数据帧。如何在运行 Intersection() 之前检查所有数据帧是否存在/已初始化,而无需使用多个 if-else 检查块?如果任何数据帧未赋值,则在执行 Intersection() 时不要使用它。有时我会收到错误 - UnboundLocalError: 赋值前引用了局部变量“df_2”,因为 file2 不存在。
或者还有其他简单的方法可以实现以下目标吗?
以下是我的方法:
if os.path.exists(file1):
df_1 = pd.read_csv(file1, header=None, names=header_1, sep=',', index_col=None)
if os.path.exists(file2):
df_2 = pd.read_csv(file2, header=None, names=header_2, sep=',', index_col=None)
if os.path.exists(file3):
df_3 = pd.read_csv(file3, header=None, names=header_3, sep=',', index_col=None)
common_columns = df_1.columns.intersection(df_2.columns).intersection(df_3.columns)
filtered_1 = df_1[common_columns]
filtered_2 = df_2[common_columns]
filtered_3 = df_3[common_columns]
concatenated_df = pd.concat([filtered_1, filtered_2, filtered_3], ignore_index=True)
你的代码已经很好了。你当前版本中有很多重复的元素。为了使其更简洁,你可以使用列表推导式,例如
[function(x) for x in a_list]
当处理可能并非始终可用的文件时,您可以使用此方法安全地合并现有的 DataFrame,而不会遇到初始化错误。该解决方案会动态加载可用数据,识别所有成功加载的数据集中的公共列,并自动合并它们:
此实现会在加载前检查文件是否存在,完全跳过所有缺失的数据源,并确保仅合并所有可用数据集中存在的列。该
reduce
操作能够高效地查找所有已加载 DataFrame 之间的共同列,而基于列表的方法则可防止对未初始化变量的引用错误。如果所有文件都不存在,它会优雅地返回一个空的 DataFrame,而不是抛出错误。您可以修改列表file_config
来添加或删除数据源,而无需更改核心逻辑。