Je voudrais lire plusieurs fichiers csv d'un répertoire dans pandas et les concaténer en un grand DataFrame. Je n'ai pas pu le comprendre cependant. Voici ce que j'ai jusqu'à présent:
import glob
import pandas as pd
# get data file names
path =r'C:\DRO\DCL_rawdata_files'
filenames = glob.glob(path + "/*.csv")
dfs = []
for filename in filenames:
dfs.append(pd.read_csv(filename))
# Concatenate all data into one DataFrame
big_frame = pd.concat(dfs, ignore_index=True)
Je suppose que j'ai besoin d'aide dans la boucle for ???
dfs
liste, ne voulez-vous pas remplacer la lignedata = pd.read_csv(filename)
pardfs.append(pd.read_csv(filename)
. Vous auriez alors besoin de parcourir la liste etconcat
, je ne pense pasconcat
, fonctionnera sur une liste dedf
s.big_frame = pd.concat(dfs, ignore_index=True)
, de toute façon une fois que vous avez une liste de dataframes vous devrez parcourir la liste et concat à?big_frame
dfs
maintenant, donc quelque chose comme çafor df in dfs: big_frame.concat(df, ignore_index=True)
devrait fonctionner, vous pouvez également essayerappend
au lieu deconcat
aussi.concat
devrait gérer une liste de DataFrames très bien comme vous l'avez fait. Je pense que c'est une très bonne approche.Réponses:
Si vous avez les mêmes colonnes dans tous vos
csv
fichiers, vous pouvez essayer le code ci-dessous. J'ai ajoutéheader=0
afin qu'après avoir lu lacsv
première ligne puisse être assignée comme noms de colonne.la source
df = pd.concat((pd.read_csv(f) for f in all_files))
En outre, on devrait peut-être utiliser à laos.path.join(path, "*.csv")
place depath + "/*.csv"
, ce qui le rend indépendant du système d'exploitation.df['filename'] = os.path.basename(file_)
dans la boucle for file_ .. vous ne savez pas si la réponse de Sid le permet?pandas.read_csv(f).assign(filename = foo)
à l'intérieur du générateur.assign
renverra l'intégralité de la trame de données, y compris la nouvelle colonnefilename
Une alternative à la réponse de darindaCoder :
la source
pd.concat((pd.read_csv(f) for f in all_files), ignore_index=True)
. Les supports intérieurs sont requis par la version 0.18.1 de Pandasglob.iglob
au lieu deglob.glob
; Le premier retourne et itérateur (au lieu d'une liste) .la source
df = pd.concat(map(lambda file: pd.read_csv(file, delim_whitespace=True), data_files))
functools.partial
, pour éviter les lambdasLa bibliothèque Dask peut lire une trame de données à partir de plusieurs fichiers:
(Source: http://dask.pydata.org/en/latest/examples/dataframe-csv.html )
Les trames de données Dask implémentent un sous-ensemble de l'API de trame de données Pandas. Si toutes les données tiennent en mémoire, vous pouvez appeler
df.compute()
pour convertir la trame de données en trame de données Pandas.la source
Presque toutes les réponses ici sont soit inutilement complexes (correspondance de motifs globaux) ou reposent sur des bibliothèques tierces supplémentaires. Vous pouvez le faire en 2 lignes en utilisant tout ce que Pandas et python (toutes les versions) ont déjà intégré.
Pour quelques fichiers - 1 doublure:
Pour de nombreux fichiers:
Cette ligne de pandas qui définit le df utilise 3 choses:
pd.read_csv()
) l'itérable (notre liste) qui est chaque élément csv dans les chemins de fichiers).la source
df = pd.concat(map(pd.read_csv, glob.glob('data/*.csv))
df = pd.concat(map(pd.read_csv(header=0), glob.glob('data/*.csv))
mais cela a donné une erreur "parser_f () manque 1 argument positionnel requis: 'filepath_or_buffer'"Edit: j'ai googlé mon chemin dans https://stackoverflow.com/a/21232849/186078 . Cependant, récemment, je trouve plus rapide de faire des manipulations à l'aide de numpy, puis de l'affecter une fois à la trame de données plutôt que de manipuler la trame de données elle-même sur une base itérative et cela semble fonctionner également dans cette solution.
Je souhaite sincèrement que quiconque accède à cette page considère cette approche, mais je ne veux pas joindre cet énorme morceau de code en tant que commentaire et le rendre moins lisible.
Vous pouvez utiliser numpy pour vraiment accélérer la concaténation de la trame de données.
Statistiques de synchronisation:
la source
Si vous souhaitez effectuer une recherche récursive ( Python 3.5 ou supérieur ), vous pouvez effectuer les opérations suivantes:
Notez que les trois dernières lignes peuvent être exprimées en une seule ligne :
Vous pouvez trouver la documentation
**
ici . Aussi, j'ai utilisé à laiglob
place deglob
, car il renvoie un itérateur au lieu d'une liste.EDIT: fonction récursive multiplateforme:
Vous pouvez envelopper ce qui précède dans une fonction multiplateforme (Linux, Windows, Mac), vous pouvez donc faire:
Voici la fonction:
la source
Facile et rapide
Importez deux ou plus
csv
sans avoir à faire une liste de noms.la source
un liner en utilisant
map
, mais si vous souhaitez spécifier des arguments supplémentaires, vous pouvez faire:Remarque:
map
en soi, ne vous permet pas de fournir des arguments supplémentaires.la source
Si les multiples fichiers csv sont zippés, vous pouvez utiliser zipfile pour tout lire et concaténer comme ci-dessous:
la source
Un autre sur-liner avec compréhension de liste qui permet d'utiliser des arguments avec read_csv.
la source
Basé sur la bonne réponse de @ Sid.
Avant de concaténer, vous pouvez charger des fichiers csv dans un dictionnaire intermédiaire qui donne accès à chaque ensemble de données en fonction du nom de fichier (dans le formulaire
dict_of_df['filename.csv']
). Un tel dictionnaire peut vous aider à identifier les problèmes liés aux formats de données hétérogènes, lorsque les noms de colonne ne sont pas alignés par exemple.Importez des modules et localisez les chemins de fichiers:
Remarque:
OrderedDict
n'est pas nécessaire, mais il conservera l'ordre des fichiers qui pourraient être utiles pour l'analyse.Chargez des fichiers csv dans un dictionnaire. Concaténer ensuite:
Les clés sont des noms de fichiers
f
et les valeurs sont le contenu de la trame de données des fichiers csv. Au lieu de l'utiliserf
comme clé de dictionnaire, vous pouvez également utiliseros.path.basename(f)
ou d'autres méthodes os.path pour réduire la taille de la clé dans le dictionnaire uniquement à la plus petite partie pertinente.la source
Alternative utilisant la
pathlib
bibliothèque (souvent préférée àos.path
).Cette méthode évite l'utilisation itérative des pandas
concat()
/apped()
.D'après la documentation de pandas:
il convient de noter que concat () (et donc append ()) fait une copie complète des données et que la réutilisation constante de cette fonction peut créer un impact significatif sur les performances. Si vous devez utiliser l'opération sur plusieurs jeux de données, utilisez une compréhension de liste.
la source
Voici comment vous pouvez utiliser Colab sur Google Drive
la source
la source