将pandas csv合并到不同的目录中

时间:2016-07-22 22:44:22

标签: python csv pandas join merge

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

dir1  
abcd__diff.csv  
efgh__diff.csv  

dir2  
abcd_diffhere.csv  
efgh_diffhere.csv

operation  
dir1/abcd_diff.csv join dir2/abcd_diffhere.csv  
dir1/efgh_diff.csv join dir2/efgh_diffhere.csv

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

2 个答案:

答案 0 :(得分: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个字符匹配的元组对的列表: abcd efgh ,...然后循环数据框合并列表

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')

答案 1 :(得分:2)

找到像这样的文件

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]