Python Pandas - 合并CSV文件并添加文件名

4
我正在尝试合并一个文件夹中的CSV文件以便进行分析。我还想附加每个文件的文件名作为一列,以便我可以确定哪些数据来自哪个文件。我已经查看了类似的问题,但它们都不适用于我。
这里是我使用的代码。此文件夹中有24个CSV文件,因此稍后使用cat合并CSV文件也很容易,因此即使有一种方法告诉我如何在每个文件中附加文件名,也将非常完美。任何帮助都将是极好的。
import pandas as pd
import os
import glob
import csv
path=r'/home/videept/Downloads/A_DeviceMotion_data/A_DeviceMotion_data/dws_1/'
with open('output.csv', 'w', newline='') as f_output:
    csv_output = csv.writer(f_output)

    for filename in glob.glob(os.path.join(path,"*.csv")):
        with open(filename, newline='') as f_input:
            csv_input = csv.reader(f_input)

            for row in csv_input:
                row.insert(0, filename)
                csv_output.writerow(row)

当我执行此操作时,单元格会进入一个无限循环,甚至不会创建新文件。我不确定如何查看正在发生的进度,所以任何关于此的想法都将是伟大的。谢谢 :)


我会在 with open(filename, newline='')... 行之前添加 print("Processing", filename, "...),以确保是否有一个文件阻塞了所有操作。如果这还不够,我还会添加类似以下的每 n 行追踪信息:for i,row in enumerate(csv_input): if (0 == i%n): print('.', end='') ... - Serge Ballesta
使用 print() 查看变量中的内容 - 即 filenamerow - furas
它们是单列CSV文件吗?你正在使用哪个版本的Python? - mohd4482
谢谢Serge,这帮助我找出了我卡住的地方。非常感激 :) - Videept Kohli
3个回答

6
我会采用这种方式(前提是你使用的是Python 3.4+):
import pandas as pd
from pathlib import Path

source_files = sorted(Path('path_to_source_directory').glob('*.csv'))

dataframes = []
for file in source_files:
    df = pd.read_csv(file) # additional arguments up to your needs
    df['source'] = file.name
    dataframes.append(df)

df_all = pd.concat(dataframes)

这样,每一行都有一列代表它的源文件,以便更轻松地进行过滤和分析。


非常感谢,这个方法可行。就像它没有将数据追加到同一个 CSV 文件中一样,这让我感到困惑。当我将数据框架写入另一个 CSV 时,列出现了。谢谢 :) - Videept Kohli
我很高兴能够帮助你。 - mohd4482

1

首先确保所有的csv文件具有相同的结构。然后确保您可以正确读取一个csv文件。然后您可以迭代执行:

import pandas as pd
import glob

df_all = pd.DataFrame()

for f in glob.glob("path/to/csv/files/prefix_*.csv"):

    df = pd.read_csv(f) # make sure to apply correct settings (sep, parse_dates, headers, missing_values)
    df["origin"] = f #add a column with a csv name
    df_all = df_all.append(df) #append new df to the "master" dataframe

df_all.to_csv("merged.csv")

更新: 如果您担心所有数据无法放入内存,请查看Dask库。


注意,您正在将所有内容加载到内存中。如果文件太多或太大,可能会导致崩溃... - Serge Ballesta
或者只需使用“csv”模块,它允许一次处理一行,无论文件的数量和大小如何... - Serge Ballesta

0

欢迎提供解决方案的链接,但请确保您的答案即使没有链接也是有用的:在链接周围添加上下文,以便其他用户了解它的内容和原因,然后引用您链接的页面中最相关的部分,以防目标页面不可用。仅仅提供链接的答案可能会被删除。 - Alessio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接