合并不同目录中的熊猫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 个字符匹配的元组对的列表:abcd、efgh 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文件到另外一个目录,相同的文件名进行数据合并,不同的文件名直接移到新文件夹