如何使用 pandas 模块合并(即“concat”)100 多个 .csv 文件?

Posted

技术标签:

【中文标题】如何使用 pandas 模块合并(即“concat”)100 多个 .csv 文件?【英文标题】:How do i merge (i.e 'concat') 100+ .csv files using the pandas module? 【发布时间】:2019-10-20 17:42:33 【问题描述】:

我是 python 数据科学的新手。所以,我想玩弄以下数据“https://www.ssa.gov/OACT/babynames/limits.html”。这里的主要问题是,它没有给我一个包含所有年份数据的文件,而是包含每年的单独文件。此外,每个单独的文件也缺少列标题。

仅供参考,数据包含自 1910 年起所有已注册美国公民的姓名、性别和一些身份证号。这些数据可供公众使用(旨在帮助人口统计学家跟踪流行名称的趋势)。

因此,我面临的一个主要问题是需要直接编辑 100 多个文件(手动打开每个文件并进行编辑),以确保所有列标题都相同(这是 concat 等函数所必需的工作)。

另一个大问题是任务的巨大规模。对 100* 个文件使用 concat 非常非常低效,而且仅仅扫描/读取数据就用掉了 100 多行代码

当然,'concat' 是为此而构建的,但我认为将它用于大约 130 个文件是非常低效的。关于缺少的列标题,我手动编辑了一些文件,但是太多了,无法直接编辑。

names2010 = pd.read_csv("../yob2010.txt")
names2011 = pd.read_csv("../yob2011.txt")
names = pd.concat([names2010, names2011])

直觉上,这是我要避免的>

#rough notation 
names = pd.concat([names1910, names1911 ..., names2017, names2018])

这只是两年的数据。我需要创建一个包含从 1910 年到 2018 年的所有数据的单个数据框。

更新:我已经弄清楚如何组合所有不同的 .txt 文件,但仍需要解析列标题。

dataframes = pd.read_csv("../yob1910.txt")
for year in range(1911, 2019):
       temp_frame = pd.read_csv("../yob.txt".format(year))
       dataframes = pd.concat([temp_frame, dataframes])

【问题讨论】:

【参考方案1】:

欢迎来到 *** - 和数据科学!看来您可能还处于学习曲线的早期阶段,还没有尝试过 Python 的原生结构——容器数据类型。它们对于通过循环简化代码非常有帮助。

使任务更容易的一种简单方法是将每个数据集作为一个项目保留在列表中。例如(此代码未经测试):

dataframes = []
for year in range(1910, 2018):
    dataframes.append(pd.read_csv(f"../yobyear.txt"))
names = pd.concat(dataframes)

请注意,文件名是从年份构造的,使用 Python 3.6 的 f-string 功能,但如果您正在使用更早的版本,您可以用其他方法替换它以获得相同的结果。两种选择:

"../yob.txt".format(year)

"../yob%d.txt" % year

【讨论】:

找出了“concat”部分。您的代码不起作用,因为数据框是一个列表,并且出于某种原因,pandas 不支持将列表的元素连接在一起,即使它们是数据框。但是,根据您的解决方案,我能够实现该算法。不要将数据帧初始化为空列表,而是将其初始化为 1910 文件。因此,每次执行循环时,我们都可以使用“concat”函数将文件与数据帧连接起来,如下所示。代码如下: 我已经更新了上面的代码,仍然不需要弄清楚列标题部分。【参考方案2】:

试试这样的:

import pandas as pd
import glob

path = r'../' # use your path
all_files = glob.glob(path + "/*.txt")

list = []

for filename in all_files:
    df = pd.read_csv(filename)
    list.append(df)

final_df = pd.concat(list, axis=0, ignore_index=True)

【讨论】:

以上是关于如何使用 pandas 模块合并(即“concat”)100 多个 .csv 文件?的主要内容,如果未能解决你的问题,请参考以下文章

pandas 合并数据函数merge join concat combine_first 区分

实测,在 Pandas 中使用 MergeJoin Concat合并数据的效率对比!

实测,在 Pandas 中使用 MergeJoin Concat合并数据的效率对比!

pandas concat 2个数据框,并在合并数据中添加一列新数据。

pandas的学习6-合并concat

搞懂Pandas数据合并,这一片就够了