将共享 2 列的多个 CSV 文件合并到一个唯一的数据框中
Posted
技术标签:
【中文标题】将共享 2 列的多个 CSV 文件合并到一个唯一的数据框中【英文标题】:Merge multiple CSV files that share 2 columns into one unique data frame 【发布时间】:2020-06-28 01:44:14 【问题描述】:我在一个文件夹中有多个 CSV 文件(例如 200 个),我想将它们合并到一个唯一的数据框中。例如,每个文件有 3 列,其中 2 列在所有文件中是通用的(Country
和 Year
),第三列在每个文件中是不同的。
例如,一个文件具有以下列:
Country Year X
----------------------
Mexico 2015 10
Spain 2014 6
其他文件可以是这样的:
Country Year A
--------------------
Mexico 2015 90
Spain 2014 67
USA 2020 8
我可以读取这些文件并将它们与以下代码合并:
x = pd.read_csv("x.csv")
a = pd.read_csv("a.csv")
df = pd.merge(a, x, how="left", left_on=["country", "year"],
right_on=["country", "year"], indicator=False)
这会产生我想要的输出,如下所示:
Country Year A X
-------------------------
Mexico 2015 90 10
Spain 2014 67 6
USA 2020 8
但是,我的问题是对每个文件做前面的处理,有200多个,我想知道我是否可以使用循环(或其他方法)来读取文件并将它们合并成一个唯一的数据框。
非常感谢,希望我说的够清楚了。
【问题讨论】:
【参考方案1】:像这样使用 glob:
import glob
print(glob.glob("/home/folder/*.csv"))
这会将您的所有文件列在一个列表中:['/home/folder/file1.csv', '/home/folder/file2.csv', .... ]
现在,您可以遍历此列表:from 1->end, keeping 0 as your base
,然后执行 pd.read_csv()
和 pd.merge()
- 它应该被排序!
【讨论】:
【参考方案2】:试试这个:
import os
import pandas as pd
# update this to path that contains your .csv's
path = '.'
# get files that end with csv in path
dir_list = [file for file in os.listdir(path) if file.endswith('.csv')]
# initiate empty list
df_list = []
# simple for loop with Try, Except that passes on iterations that throw errors when trying to 'read_csv' your files
for file in dir_list:
try:
# append to df_list and set your indices to match across your df's for later pd.concat to work
df_list.append(pd.read_csv(file).set_index(['Country', 'Year']))
except: # change this depending on whatever Errors pd.read_csv() throws
pass
concatted = pd.concat(df_list)
【讨论】:
以上是关于将共享 2 列的多个 CSV 文件合并到一个唯一的数据框中的主要内容,如果未能解决你的问题,请参考以下文章
在 Dataflow 中使用啥转换来合并具有不同列的 csv 文件,同时将它们加载到 BigQuery?
Pandas:连接多个 .csv 文件并返回聚合了同名列的 Dataframe