【问题标题】:How to iterate through a folder of csv files如何遍历 csv 文件的文件夹
【发布时间】:2018-01-16 09:53:59
【问题描述】:

我对python真的很陌生,所以请多多包涵!

我的桌面上有一个文件夹,其中包含一些名为“File 1.csv”、“File 2.csv”等的 csv 文件。在每个文件中,都有一个表格,如下所示:

    Animal   Level
    Cat      1
    Dog      2
    Bird     3
    Snake    4

但每个文件在“动物”列中都有一些不同之处。我编写了以下代码,一次只比较两个文件并返回匹配的动物:

def matchlist(file1, file2): 
    new_df = pd.DataFrame()
    file_one = pd.read_csv(file1)
    file_two = pd.read_csv(file2)
    for i in file_one["Animal"]:
        df_temp = file_two[file_two["Animal"] == i]
        new_df = new_df.append(df_temp)
        df_temp = pd.DataFrame()
   return new_df

但这一次只能比较两个文件。有没有一种方法可以遍历该单个文件夹中的所有文件并返回与上面的 new_df 匹配的所有文件?

例如,new_df 比较文件 1 和文件 2。然后,我正在寻找将 new_df 与文件 3、文件 4、文件 5 等进行比较的代码。

谢谢!

【问题讨论】:

    标签: python-3.x pandas csv dataframe iteration


    【解决方案1】:

    我不确定这是否真的是你想要的,我还不能评论你的问题......所以:

    此函数返回一个数据框,其中包含可以在所有 csv 文件中找到的动物(可能非常小)它使用动物名称作为键,因此不会考虑级别值

    import pandas as pd
    import os, sys
    
    def matchlist_iter(folder_path):
    
        # get list with filenames in folder and throw away all non ncsv
        files = [file_path for file_path in os.listdir(folder_path) if file_path.endswith('.csv')]
    
        # init return df with first csv
        df = pd.read_csv(os.path.join(folder_path, files[0]), )
    
        for file_path in files[1:]:
            print('compare: {}'.format(file_path))
            df_other = pd.read_csv(os.path.join(folder_path, file_path))
    
            # only keep the animals that are in both frames
            df = df_other[df['Animal'].isin(df_other['Animal'])]
    
        return df
    
    if __name__ == '__main__':
        matched = matchlist_iter(sys.argv[1])
        print(matched)
    

    我在这里找到了一个类似的问题,有更多的回答者关于比赛:Compare Python Pandas DataFrames for matching rows

    编辑:添加 csv 和示例输出

    csv

    Animal,  Level
    Cat,      1
    Dog,      2
    Bird,     3
    Snake,    4
    

    csv

    Animal, Level
    Cat,      1
    Parrot,   2
    Bird,     3
    Horse,    4
    

    输出

    compare: csv2.csv
      Animal   Level
    0    Cat       1
    2   Bird       3
    

    【讨论】:

      【解决方案2】:

      我构建了一组六个文件,其中只有File 1.csvFile 6.csv 的第一列是相同的。

      您只需要每个 csv 的第一列进行比较,因此我安排只从每个文件中提取那些。

      >>> import pandas as pd
      >>> from pathlib import Path
      
      >>> column_1 = pd.read_csv('File 1.csv', sep='\s+')['Animal'].tolist()
      >>> column_1
      ['Cat', 'Dog', 'Bird', 'Snake']
      >>> for filename in Path('.').glob('*.csv'):
      ...     if filename.name == 'File 1.csv':
      ...         continue
      ...     next_column = pd.read_csv(filename.name, sep='\s+')['Animal'].tolist()
      ...     if column_1 == next_column:
      ...         print (filename.name)
      ... 
      File 6.csv
      

      正如预期的那样,File 6.csv 是唯一发现与File 1.csv 相同(在第一列中)的文件。

      【讨论】:

        猜你喜欢
        • 2017-02-25
        • 2019-04-11
        • 2021-07-01
        • 2019-05-08
        • 1970-01-01
        • 2020-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多