我正在尝试将一个文件夹中的多个 csv 文件收集到一个数据框中。通过这个先前的问题,我们意识到真正的问题是某些 csv 文件(摘要文件)包含多个表。因此,当前解决方案的产品(下面的代码)会跳过大部分数据。
是否有任何合理的方法来收集多个文件,每个文件可能包含多个表?
或者,如果这样更容易,我可以为较大的摘要文件中包含的每个表使用单独的文本文件。
无论如何,我寻求的是生成的数据帧的单个row应包含来自摘要文件内的三个单独的文本文件/三个表的数据。
这是我的代码,用于从文件夹中添加文本文件。
import pandas as pd
import os
import glob
#define path to dir containing the summary text files
files_folder = "/data/TB/WA_dirty_prep_reports/"
#create a df list using list comprehension
files = [pd.read_csv(file, sep='\t', on_bad_lines='skip') for file in glob.glob(os.path.join(files_folder,"*txt"))]
#concatanate the list of df's into one df
files_df = pd.concat(files)
print(files_df)
您似乎正在尝试从文件夹中读取多个文本文件并将它们连接到一个 DataFrame 中。但是,如果文本文件包含多个表并且您看到意外结果,则可能是由于您读取和连接它们的方式造成的。文本文件中的每个表可能具有不同的结构,从而导致直接串联出现问题。
以下是如何修改代码以实现此目的的粗略概述:
import pandas as pd
import os
import glob
#define path to dir containing the summary text files
files_folder = "/data/TB/WA_dirty_prep_reports/"
# Define a function to process a text file and extract tables
def process_text_file(file_path):
# Implement logic to extract tables from the file and convert to DataFrames
# Return a list of DataFrames
# Create an empty list to store DataFrames
all_dfs = []
# Loop through the text files and process each
for file_path in glob.glob(os.path.join(files_folder, "*.txt")):
dataframes_from_file = process_text_file(file_path)
all_dfs.extend(dataframes_from_file)
# Concatenate all DataFrames into a single DataFrame
final_df = pd.concat(all_dfs)
# Print the final DataFrame
print(final_df)
在 process_text_file 函数中,您将实现从给定文本文件中提取表并将其转换为单独的 DataFrame 的逻辑。您可能需要使用正则表达式、字符串操作或其他技术来实现此目的,具体取决于文本文件的结构。
请记住,process_text_file 函数的确切实现取决于文本文件的结构和格式。如果文本文件中的表格具有一致的结构,您应该能够提取必要的数据。如果结构发生变化,提取过程可能会更复杂,并且可能需要自定义解析逻辑。
1)包含多个数据帧的单个文件的方法
基于 Python Pandas - 读取包含多个表的 csv 文件
强制读取列数过多的文件,数据框将包含所有行
检测表格标记(使用此方法,您必须知道或期望这些标记)
使用 groupby 根据这些标记拆分表
阅读过多的列:(这里是10)
df_read = pd.read_csv(your_file, header=None, names=range(10))
table_names = ["table1", "table2"]
df_read['group'] = read_df[0].isin(table_names).cumsum()
tables = {g.iloc[0,0]: g.iloc[1:] for k,g in df_read.groupby(df_read['group'])}
# Here clean-up separate tables from the generated 'tables' dictionary
pd.concat(tables, axis=0)
您必须发布一个最小的示例才能获得更具体的建议。你觉得怎么样?
2)接下来,收集多个文件
如将多个文本文件添加到 Pandas 数据框中 ParserError
def file_to_df(file, force_max_columns):
'''convert one file into one temporary dataframe'''
# insert the above lines #
# Comprehension then concatenation
files = glob.glob(os.path.join(files_folder,"*txt")
force_max_columns = 99
df = pd.concat([file_to_df(file, force_max_columns) for file in files]
# post-processing e.g. drop void excess columns
快到了。让我们知道,但如果遇到困难,请发布最小的示例。您确实需要显示一些文件内容。