Python基础:如何修改批量处理代码获取全部DataFrame?
解决方法
你的核心问题是循环内使用return会直接终止函数,导致只返回第一个处理后的DataFrame。而你尝试concat没成功,大概率是没先把所有DataFrame收集起来再合并,而是在循环里错误地调用了concat。
下面是两种可行的修改方案:
方案一:返回合并后的单个大DataFrame(适合后续统一处理)
先创建一个空列表存储每个JSON文件生成的DataFrame,循环结束后用pd.concat合并所有数据:
import pandas as pd import os def all_data(dir_path): df_collection = [] # 遍历目录下的所有文件 for filename in os.listdir(dir_path): if filename.endswith(".json"): file_path = os.path.join(dir_path, filename) # 读取JSON并转为DataFrame df = pd.read_json(file_path) # 处理CSV导出(按需保留) df.to_csv(f"{os.path.splitext(filename)[0]}.csv", index=False) # 将当前DataFrame加入集合 df_collection.append(df) # 合并所有DataFrame,ignore_index重置索引避免重复 if df_collection: return pd.concat(df_collection, ignore_index=True) # 没有JSON文件时返回空DataFrame return pd.DataFrame()
方案二:返回所有DataFrame的列表(适合单独处理每个文件的数据)
如果需要后续对每个文件的DataFrame做单独操作,直接返回存储所有DataFrame的列表即可:
import pandas as pd import os def all_data(dir_path): df_list = [] for filename in os.listdir(dir_path): if filename.endswith(".json"): file_path = os.path.join(dir_path, filename) df = pd.read_json(file_path) df.to_csv(f"{os.path.splitext(filename)[0]}.csv", index=False) df_list.append(df) return df_list
为什么之前的concat没生效?
如果之前你把pd.concat写在循环内部,每次循环只会合并当前DF和之前的,但最后返回的还是循环里的return,或者只保留了最后一次合并的结果。必须先把所有DF收集到列表,在循环结束后再执行合并操作。
使用示例
- 方案一使用:
# 获取合并后的大DataFrame final_df = all_data("./your_json_directory") # 后续统一处理,比如筛选、统计 print(final_df.describe())
- 方案二使用:
# 获取所有DataFrame的列表 df_list = all_data("./your_json_directory") # 遍历处理每个DF for idx, df in enumerate(df_list): print(f"第{idx+1}个文件的数据:") print(df.head()) # 也可以自己手动合并 combined_df = pd.concat(df_list, ignore_index=True)
内容的提问来源于stack exchange,提问作者shrykullgod
相关产品推荐
相关产品推荐

