合并不同目录中的熊猫csv

Posted

技术标签:

【中文标题】合并不同目录中的熊猫csv【英文标题】:merge pandas csv in different directories 【发布时间】:2016-11-26 22:27:48 【问题描述】:

我在不同目录中有同名的 csv 文件,我想将它们合并为一个 csv。

目录1 abcd__diff.csv efgh__diff.csv 目录2 abcd_diffhere.csv efgh_diffhere.csv 手术 dir1/abcd_diff.csv 加入 dir2/abcd_diffhere.csv dir1/efgh_diff.csv 加入 dir2/efgh_diffhere.csv

我想使用公共字段合并它们。我可以使用 pandas join 运算符,但是跨目录搜索和映射文件名的最有效方法是什么。 我使用字符 __ 拆分文件名,给出每个目录中具有相同名称的文件列表。我可以执行两个 for 循环并进行迭代,但这效率不高,因为我有大约 200 个文件。

【问题讨论】:

每对会合并成多个dfs吗?还是对合并并附加到最​​终的大df? 每一对都合并成一个独特的新数据框,所以最后我有多个数据框。 【参考方案1】:

像这样放置文件

files1 = []
files2 = []
dir1path = './dir1/'
dir2path = './dir2/'
dir1 = os.listdir(dir1path)
dir2 = os.listdir(dir2path)

for f in dir1:
    fmatch = f.split('.csv')[0] + 'here.csv'    
    if fmatch in dir2:
        files1.append(f)
        files2.append(fmatch)

files1 = [os.path.join(dir1path, f) for f in files1]
files2 = [os.path.join(dir2path, f) for f in files2]

fpairs = zip(files1, files2)

然后创建数据框列表

# edit this lambda function accroding to your needs
# it will have to be specific to your csv formatting
rf = lambda f: pd.read_csv(f)

dfs = [rf(fp[0]).merge(rf(fp[1]), on='Key') for fp in fpairs]

【讨论】:

【参考方案2】:

在两个文件名列表中考虑zip(),其中附加了数据框字典(避免 200 个单独的对象)。字典的键将是每对共享的唯一文件名。下面假设文件名列表没有目录,只有文件的基本名称。

import os
...
dfDict = 
for i, j in zip(dir1list, dir2list):
   temp1 = pd.read_csv(os.path.join(dir1, i))
   temp2 = pd.read_csv(os.path.join(dir2, j))

   key = i.replace('.csv','')
   dfDict[key] = pd.merge(temp1, temp2, on='commonfield')

如果列表是无序的,甚至是不同长度的,考虑一个列表推导比较两者,并创建一个由前 4 个字符匹配的元组对的列表:abcdefgh em>, ... 然后循环列表进行数据框合并

dir1list = ['abcd__diff.csv','efgh__diff.csv']
dir2list = ['abcd_diffhere.csv','efgh_diffhere.csv']

allfiles = [(i,j) for i in dir1list for j in dir2list if i[:4] == j[:4]]

dfDict = 
for file in allfiles:
   temp1 = pd.read_csv(os.path.join(dir1, file[0]))
   temp2 = pd.read_csv(os.path.join(dir2, file[1]))

   key = i[:4]
   dfDict[key] = pd.merge(temp1, temp2, on='commonfield')

【讨论】:

当我压缩 dirlist1 和 dirlist2 时,我如何确保文件名的初始部分匹配并且同名文件被压缩为一个字典。文件名也不完全相同。有一个__字段,前面的名字是一样的。 查看更新您在两个列表之间置换的位置并按前 4 个字符创建配对匹配。此外,您不希望全局环境中有 100 个字典。只需对所有 100 个 dfs 使用一个由键索引的字典。

以上是关于合并不同目录中的熊猫csv的主要内容,如果未能解决你的问题,请参考以下文章

案例1-合并2个不同文件夹中的csv文件到另外一个目录,相同的文件名进行数据合并,不同的文件名直接移到新文件夹

使用 pandas(和 glob?)合并目录中的大量(csv)数据文本文件

将熊猫数据框保存为 csv 并覆盖现有文件

熊猫与“左”选项合并正在丢失左侧数据框中的行

如何将一列中的两列合并为日期与熊猫?

使用熊猫循环合并大量csv文件[重复]