将包含多个表的多个文本文件收集到 Pandas 数据框

问题描述 投票:0回答:2

我正在尝试将一个文件夹中的多个 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)
python pandas dataframe concatenation read-csv
2个回答
0
投票

您似乎正在尝试从文件夹中读取多个文本文件并将它们连接到一个 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 函数的确切实现取决于文本文件的结构和格式。如果文本文件中的表格具有一致的结构,您应该能够提取必要的数据。如果结构发生变化,提取过程可能会更复杂,并且可能需要自定义解析逻辑。


0
投票

1)包含多个数据帧的单个文件的方法

基于 Python Pandas - 读取包含多个表的 csv 文件

  1. 强制读取列数过多的文件,数据框将包含所有行

  2. 检测表格标记(使用此方法,您必须知道或期望这些标记)

  3. 使用 groupby 根据这些标记拆分表

  4. 阅读过多的列:(这里是10)

df_read = pd.read_csv(your_file, header=None, names=range(10))
  1. 通过识别左上角的单元格来标记表格。 “您的表格标记”,“另一个表格标记”可能是您的第一列的名称。
table_names = ["table1", "table2"]
df_read['group'] = read_df[0].isin(table_names).cumsum()
  1. 将表格引用到字典中:
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
  1. 只要这样做有意义,您就可以将它们连接起来
pd.concat(tables, axis=0)

您必须发布一个最小的示例才能获得更具体的建议。你觉得怎么样?

2)接下来,收集多个文件

将多个文本文件添加到 Pandas 数据框中 ParserError

并且 加快 Bin 文件与 Pandas 的连接和导出速度

  1. 定义处理单个文件的函数
  2. 理解并连接有效负载
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

快到了。让我们知道,但如果遇到困难,请发布最小的示例。您确实需要显示一些文件内容。

© www.soinside.com 2019 - 2024. All rights reserved.