2017-08-08 3 views
0

Je suis vraiment nouveau sur python, alors s'il vous plaît ours avec moi!Comment itérer à travers un dossier de fichiers CSV

J'ai un dossier sur mon bureau qui contient quelques fichiers csv nommés "File 1.csv", "File 2.csv" et ainsi de suite. Dans chaque fichier, il y a une table qui ressemble à:

Animal Level 
    Cat  1 
    Dog  2 
    Bird  3 
    Snake 4 

Mais chacun des fichiers a quelques différences dans la colonne « Animal ». J'ai écrit le code suivant qui compare deux fichiers à la fois et retourne les animaux qui correspondent à:

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 

Mais ce ne compare que deux fichiers à la fois. Y a-t-il un moyen de parcourir tous les fichiers de ce dossier et de renvoyer tous ceux qui correspondent à new_df ci-dessus? Par exemple, new_df compare le fichier 1 et le fichier 2. Ensuite, je cherche un code qui compare new_df au fichier 3, au fichier 4, au fichier 5, etc.

Merci!

Répondre

0

Je ne suis pas sûr si elle est vraiment ce que vous voulez, je ne peux pas encore de commentaire sur vous des questions ... donc:

cette fonction retourne une trame de données avec des animaux qui peuvent être trouvés dans tous les fichiers CSV (être très faible), il utilise le nom de l'animal comme la clé, de sorte que la valeur de niveau ne sera pas considéré

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) 

que j'ai trouvé une question similaire avec plus answerers en ce qui concerne le match ici:Compare Python Pandas DataFrames for matching rows

EDIT: ajout sortie CSV et échantillon

csv

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

csv

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

sortie

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

I construit un ensemble o f six fichiers dans lesquels seules les premières colonnes de File 1.csv et File 6.csv sont identiques.

Vous n'avez besoin que de la première colonne de chaque csv à des fins de comparaison, je m'arrange donc pour extraire uniquement ceux de chaque fichier.

>>> 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 

Comme prévu, File 6.csv est le seul fichier trouvé identiques (dans la première colonne) à File 1.csv.