【问题标题】:merge pandas csv in different directories合并不同目录中的熊猫csv
【发布时间】: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?
  • 每一对都合并成一个独特的新数据框,所以最后我有多个数据框。

标签: python csv pandas join merge


【解决方案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 使用一个由键索引的字典。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    • 2022-01-06
    • 2015-01-08
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 2023-03-06
    相关资源
    最近更新 更多