我在不同的目录中有相同名称的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个文件。
答案 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]