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

Posted

技术标签:

【中文标题】Python Pandas - 组合 CSV 并添加文件名【英文标题】:Python Pandas - Combine CSVs and add filename 【发布时间】:2019-11-14 21:18:25 【问题描述】:

我正在尝试将 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='') ... 使用 print() 查看变量中的内容 - 即。 filenamerow 它们是单列 CSV 文件吗?你用的是什么版本的python? 感谢 Serge,这帮助我找出了卡住的地方。欣赏它:) 【参考方案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 库。

【讨论】:

当心,您正在将所有内容加载到内存中。如果文件太多和/或太大,它可能会崩溃...... 或者只是 csv 模块,它允许一次只处理一行,无论文件的数量和大小如何......【参考方案2】:

我会这样做(前提是您使用的是 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 时,该列出现了。谢谢:) 很高兴能帮到你【参考方案3】:

您可以在不使用任何库的情况下检查此代码: https://github.com/BeleganStartup/Merge-Combine-CSV-files---PYTHON

【讨论】:

欢迎提供解决方案链接,但请确保您的答案在没有它的情况下有用:add context around the link 这样您的其他用户就会知道它是什么以及为什么会出现,然后引用最相关的您链接到的页面的一部分,以防目标页面不可用。 Answers that are little more than a link may be deleted.

以上是关于Python Pandas - 组合 CSV 并添加文件名的主要内容,如果未能解决你的问题,请参考以下文章

使用 Pandas [with key column] 将 CSV 与不同的列组合

使用 pandas 组合两个 csv 文件

使用python组合两个文件?

pandas to_csv read_csv编码错误

如何使用 pandas 从文件夹中读取和组合具有相似名称的 .csv 文件

使用 Pandas 使用 for 循环写入 Excel CSV