【问题标题】:Merge multiple CSVs with the similar filename合并多个具有相似文件名的 CSV
【发布时间】:2021-09-24 10:41:41
【问题描述】:

我在一个目录 (1000+) 中有大量包含不同数据的 CSV。几个 CSV 的列比其他的多/少,我希望能够合并列相同的每个 CSV。幸运的是,每个 CSV 文件名中都有一个字符串,可以帮助表示它也属于哪个“组”。

考虑 3 个例子:

CSV1 named: **Report3443_GMA_45_20210516_111358.csv**
Contains:
| Date       | ID     | Amount  |
| ---------- | ------ | ------- |
| 01/05/2021 | GMA_45 | 1565.43 |
| 02/05/2021 | GMA_45 | 58963.9 |
| 05/05/2021 | GMA_45 | 962.27  |

CSV2 named: **Report7853_ATH_16_20210516_095745.csv**
Contains:
| Date       | ID     | Amount  | Subgroup |
| ---------- | ------ | ------- | -------- |
| 03/05/2021 | ATH_16 | 6345.01 | 861312   |
| 04/05/2021 | ATH_16 | 7824.69 | 861312   |
| 09/05/2021 | ATH_16 | 962.27  | 846131   |

CSV3 named: **Report45896_GMA_45_20210516_143825.csv**
Contains:
| Date       | ID     | Amount  |
| ---------- | ------ | ------- |
| 11/05/2021 | GMA_45 | 9915.12 |
| 14/05/2021 | GMA_45 | 66452.05|
| 15/05/2021 | GMA_45 | 4893.85 |

如您所见,CSV1 和 CSV3 包含相同的文件名字符串 (GMA_45),并且它们的列数相同。我想要这些 CSV 的合并版本,以及文件名中的字符串相同的任何其他迭代。

我使用post 中的代码让我开始进行一些更改。代码工作正常,尽管输出 CSV 在每行之间写入一个空白行,并且每次添加匹配的 CSV 时都会重复标题。如何删除空白行并删除任何重复的标题整体(除了主标题)?我还想删除所有重复的行。

这是我的代码:

import glob
import os
import pandas

def create_merged_csv(key, filelist):
    with open('Concat_{}.csv'.format(key), 'w+t') as outfile:
        for filename in filelist:
            df = pandas.read_csv(filename, header=None)
            df.to_csv(outfile, index=False, header=None)

def find_filesets(path="."):
    csv_files = {}
    for name in glob.glob("{}/*_*.csv".format(path)):
        key = '_'.join(name.split('_')[1:-2])
        csv_files.setdefault(key, []).append(name)

    for key,filelist in csv_files.items(): 
        print(key, filelist)
        create_merged_csv(key, filelist)

TEST_DIR_NAME="C:\\Users\\ME\\Desktop\\Python\\MergeFiles\\Input"
os.chdir("MergeFiles")
find_filesets(TEST_DIR_NAME)

【问题讨论】:

    标签: python pandas csv merge data-cleaning


    【解决方案1】:

    我已经更新了代码,请检查一下

    import glob
    import os
    import pandas
    
    def create_merged_csv(key, filelist):
        outfile = 'Concat_{}.csv'.format(key)
        l = []
        for filename in filelist:
            df = pandas.read_csv(filename)
            l.append(df)
        pd.concat(l).to_csv(outfile, index=False)
    
    def find_filesets(path="."):
        csv_files = {}
        for name in glob.glob("{}/*_*.csv".format(path)):
            key = '_'.join(name.split('_')[1:-2])
            csv_files.setdefault(key, []).append(name)
    
        for key,filelist in csv_files.items(): 
            print(key, filelist)
            create_merged_csv(key, filelist)
    
    TEST_DIR_NAME="C:\\Users\\ME\\Desktop\\Python\\MergeFiles\\Input"
    os.chdir("MergeFiles")
    find_filesets(TEST_DIR_NAME)
    

    这可能会有所帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-22
      • 2018-09-24
      • 2019-07-13
      • 2020-05-11
      • 1970-01-01
      • 2022-09-30
      • 1970-01-01
      相关资源
      最近更新 更多