0
votes

Y a-t-il un moyen de trouver l'intersect dans plusieurs noms de fichiers entre plusieurs en-têtes de CSV?

J'essaie de boucler tous les fichiers CSV dans un dossier et de trouver tous les noms d'en-tête dans tous les fichiers. Je pense que le code commencerait comme ça ... il a besoin de traitement et d'amélioration, à coup sûr. XXX

Il s'agit simplement de boucler via des fichiers dans un dossier, évidemment. Ce que je veux faire, c'est comparer tous les en-têtes CSV dans un dossier et vérifier les matchs (intersection) de tous les en-têtes et imprimez ce résultat. Est-ce que ça fait du sens? J'espère bien. Je devrai faire une union de tous ces fichiers à un moment donné. J'essaie de déterminer le meilleur moyen d'obtenir tous les en-têtes communs ensemble. Il s'agit du dénominateur commun le plus bas de la série de données complète.

Donc, si j'ai 4 fichiers avec ce schéma: xxx

et, j'en ai un Fichier avec ce schéma: xxx

alors, c'est vouloir que je vois: xxx


1 commentaires

Vous devriez essayer d'écrire quelque chose vous-même qui résout le problème et posez des questions spécifiques avec elle - la question telle qu'elle est actuellement est trop large et constitue une question à des personnes ici de résoudre le problème pour vous. Vous devez: ouvrir les fichiers que vous avez trouvés, lire les en-têtes, collecter les en-têtes et trouver un moyen d'obtenir l'intersection (pas l'union) des ensembles résultants. Toutes ces tâches relativement triviales, mais n'hésitez pas à venir vous demander sur l'une d'entre elles si vous avez du mal à les mettre en œuvre. (Au fait, la réponse à votre question est "Oui, il y a")


3 Réponses :


2
votes

Oui, vous pouvez le faire mais vous demanderait de boucler dans une boucle sur la liste des fichiers et de stocker les résultats. En ce qui concerne un échantillon, voici le code.

import pandas as pd
df1 = pd.read_csv("File1.csv")
df2 = pd.read_csv("File2.csv")
setA = set(df1.columns)
setB = set(df2.columns)
common = setA.intersection(setB)


2 commentaires

Pandas a également une fonction d'intersection d'indice. df.Columns.InterSection (DF.Columns). Aussi il a un paramètre de tri qui si défini sur FALSE conserve l'ordre d'origine


@ Pravan ... C'est presque exactement ce que je veux. Mais comment le code peut-il être modifié pour lire tous les fichiers CSV dans un dossier et faire de même. Donc, je peux avoir plus de 100 fichiers que j'ai besoin de vérifier. Je ne veux pas de coder les noms de fichiers. Je souhaite que le code lu sur les fichiers de manière dynamique et que vous trouvez l'intersection de tous les noms de champs. Comment cela peut-il être fait? Merci.



2
votes

Vous semblez chercher à:

  1. Identifiez les fichiers .csv
  2. saisir les en-têtes
  3. intersect les en-têtes

    La réponse ci-dessus fonctionnera pour les pièces 2 et 3. Pour la partie 1, je recommanderais quelque chose comme ce qui suit pour accrocher des chemins à tous les fichiers pertinents. Sauf si vous avez un motif de fantaisie pour correspondre, bon vieux glob est le meilleur. xxx

    Je créerais alors un ensemble de maître contre lequel vous pouvez comparer le En-tête de chaque nouveau .csv: xxx

    quelque chose comme ça devrait ajouter tous les en-têtes uniques.


2 commentaires

Cela semble très prometteur, mais je ne reçois aucun résultat. Je vais mettre à jour mon post original, en fonction de vos suggestions, et j'espère que quelqu'un viendra passer par une solution de travail.


C'était une sorte de pseudo-code afin que vous puissiez obtenir un gist pour ce que la solution pourrait ressembler. Il y a des nuances qui devront être élaborées sur votre fin, bien sûr. Généralement, si vous posez la question plus approfondie, la qualité et l'utilité des réponses s'amélioreront. Bonne chance.



0
votes

J'ai résolu le problème de la manière suivante. Le code fonctionne pour n'importe quel nombre de fichiers CSV.

import pandas as pd
import csv
import glob

path = r'PATH_TO_CSV_DIR' # use your path
all_files = glob.glob(path + "/*.csv")
df1 = pd.read_csv('PATH_TO_CSV_DIR/c15.csv') # to initialize the master_set
master_set = set(df1.columns)

for file in all_files:
    this_df = pd.read_csv(file)
    cols = set(this_df.columns)
    master_set = master_set.intersection(cols)

w = csv.writer(open("CommonColumns.csv","w")) #it gives a CSV file of common header. The common header can be used later for other operations. 
w.writerow(master_set)
print(master_set)


0 commentaires