pandas
Outils Pandas IO (lecture et sauvegarde de fichiers)
Recherche…
Remarques
La documentation officielle des pandas comprend une page sur IO Tools avec une liste de fonctions pertinentes pour lire et écrire dans des fichiers, ainsi que des exemples et des paramètres communs.
Lecture du fichier csv dans DataFrame
Exemple de lecture du fichier data_file.csv
tel que:
Fichier:
index,header1,header2,header3
1,str_data,12,1.4
3,str_data,22,42.33
4,str_data,2,3.44
2,str_data,43,43.34
7, str_data, 25, 23.32
Code:
pd.read_csv('data_file.csv')
Sortie:
index header1 header2 header3
0 1 str_data 12 1.40
1 3 str_data 22 42.33
2 4 str_data 2 3.44
3 2 str_data 43 43.34
4 7 str_data 25 23.32
Quelques arguments utiles:
sep
Le séparateur de champ par défaut est une virgule,
. Utilisez cette option si vous avez besoin d'un délimiteur différent, par exemplepd.read_csv('data_file.csv', sep=';')
index_col
Avecindex_col = n
(n
entier) vous dire pandas géants à utiliser la colonnen
pour indexer le dataframe. Dans l'exemple ci-dessus:pd.read_csv('data_file.csv', index_col=0)
Sortie:
header1 header2 header3 index 1 str_data 12 1.40 3 str_data 22 42.33 4 str_data 2 3.44 2 str_data 43 43.34 7 str_data 25 23.32
skip_blank_lines
Par défaut, les lignes vides sont ignorées. Utilisezskip_blank_lines=False
pour inclure les lignes vides (elles seront remplies avec les valeursNaN
)pd.read_csv('data_file.csv', index_col=0,skip_blank_lines=False)
Sortie:
header1 header2 header3 index 1 str_data 12 1.40 3 str_data 22 42.33 4 str_data 2 3.44 2 str_data 43 43.34 NaN NaN NaN NaN 7 str_data 25 23.32
parse_dates
Utilisez cette option pour analyser les données de date.Fichier:
date_begin;date_end;header3;header4;header5 1/1/2017;1/10/2017;str_data;1001;123,45 2/1/2017;2/10/2017;str_data;1001;67,89 3/1/2017;3/10/2017;str_data;1001;0
Code pour analyser les colonnes
0
et1
tant que dates:pd.read_csv('f.csv', sep=';', parse_dates=[0,1])
Sortie:
date_begin date_end header3 header4 header5 0 2017-01-01 2017-01-10 str_data 1001 123,45 1 2017-02-01 2017-02-10 str_data 1001 67,89 2 2017-03-01 2017-03-10 str_data 1001 0
Par défaut, le format de date est déduit. Si vous souhaitez spécifier un format de date que vous pouvez utiliser par exemple
dateparse = lambda x: pd.datetime.strptime(x, '%d/%m/%Y') pd.read_csv('f.csv', sep=';',parse_dates=[0,1],date_parser=dateparse)
Sortie:
date_begin date_end header3 header4 header5 0 2017-01-01 2017-10-01 str_data 1001 123,45 1 2017-01-02 2017-10-02 str_data 1001 67,89 2 2017-01-03 2017-10-03 str_data 1001 0
Vous trouverez plus d'informations sur les paramètres de la fonction dans la documentation officielle .
Enregistrement de base dans un fichier csv
raw_data = {'first_name': ['John', 'Jane', 'Jim'],
'last_name': ['Doe', 'Smith', 'Jones'],
'department': ['Accounting', 'Sales', 'Engineering'],}
df = pd.DataFrame(raw_data,columns=raw_data.keys())
df.to_csv('data_file.csv')
Analyse des dates lors de la lecture de csv
Vous pouvez spécifier une colonne contenant des dates afin que les pandas les analysent automatiquement lors de la lecture du fichier csv
pandas.read_csv('data_file.csv', parse_dates=['date_column'])
Feuille de calcul à dictée de DataFrames
with pd.ExcelFile('path_to_file.xls) as xl: d = {sheet_name: xl.parse(sheet_name) for sheet_name in xl.sheet_names}
Lire une fiche spécifique
pd.read_excel('path_to_file.xls', sheetname='Sheet1')
Il existe de nombreuses options d’analyse pour read_excel
(similaire aux options de read_csv
.
pd.read_excel('path_to_file.xls', sheetname='Sheet1', header=[0, 1, 2], skiprows=3, index_col=0) # etc.
Test read_csv
import pandas as pd
import io
temp=u"""index; header1; header2; header3
1; str_data; 12; 1.4
3; str_data; 22; 42.33
4; str_data; 2; 3.44
2; str_data; 43; 43.34
7; str_data; 25; 23.32"""
#after testing replace io.StringIO(temp) to filename
df = pd.read_csv(io.StringIO(temp),
sep = ';',
index_col = 0,
skip_blank_lines = True)
print (df)
header1 header2 header3
index
1 str_data 12 1.40
3 str_data 22 42.33
4 str_data 2 3.44
2 str_data 43 43.34
7 str_data 25 23.32
Compréhension de la liste
Tous les fichiers sont dans des files
. Commencez par créer une liste de DataFrames, puis concat
les:
import pandas as pd
import glob
#a.csv
#a,b
#1,2
#5,8
#b.csv
#a,b
#9,6
#6,4
#c.csv
#a,b
#4,3
#7,0
files = glob.glob('files/*.csv')
dfs = [pd.read_csv(fp) for fp in files]
#duplicated index inherited from each Dataframe
df = pd.concat(dfs)
print (df)
a b
0 1 2
1 5 8
0 9 6
1 6 4
0 4 3
1 7 0
#'reseting' index
df = pd.concat(dfs, ignore_index=True)
print (df)
a b
0 1 2
1 5 8
2 9 6
3 6 4
4 4 3
5 7 0
#concat by columns
df1 = pd.concat(dfs, axis=1)
print (df1)
a b a b a b
0 1 2 9 6 4 3
1 5 8 6 4 7 0
#reset column names
df1 = pd.concat(dfs, axis=1, ignore_index=True)
print (df1)
0 1 2 3 4 5
0 1 2 9 6 4 3
1 5 8 6 4 7 0
Lire en morceaux
import pandas as pd
chunksize = [n]
for chunk in pd.read_csv(filename, chunksize=chunksize):
process(chunk)
delete(chunk)
Enregistrer dans un fichier CSV
Enregistrer avec les paramètres par défaut:
df.to_csv(file_name)
Ecrire des colonnes spécifiques:
df.to_csv(file_name, columns =['col'])
Le délimiteur Difault est ',' - pour le changer:
df.to_csv(file_name,sep="|")
Ecrire sans l'en-tête:
df.to_csv(file_name, header=False)
Écrivez avec un en-tête donné:
df.to_csv(file_name, header = ['A','B','C',...]
Pour utiliser un encodage spécifique (par exemple "utf-8"), utilisez l’argument de codage:
df.to_csv (nom_fichier, encoding = 'utf-8')
Analyse des colonnes de date avec read_csv
Date ont toujours un format différent, ils peuvent être analysés en utilisant une fonction parse_dates spécifique.
Ce input.csv :
2016 06 10 20:30:00 foo 2016 07 11 19:45:30 bar 2013 10 12 4:30:00 foo
Peut être analysé comme ceci:
mydateparser = lambda x: pd.datetime.strptime(x, "%Y %m %d %H:%M:%S")
df = pd.read_csv("file.csv", sep='\t', names=['date_column', 'other_column'], parse_dates=['date_column'], date_parser=mydateparser)
L' argument parse_dates est la colonne à analyser
date_parser est la fonction d'analyse
Lire et fusionner plusieurs fichiers CSV (avec la même structure) en un seul fichier DF
import os
import glob
import pandas as pd
def get_merged_csv(flist, **kwargs):
return pd.concat([pd.read_csv(f, **kwargs) for f in flist], ignore_index=True)
path = 'C:/Users/csvfiles'
fmask = os.path.join(path, '*mask*.csv')
df = get_merged_csv(glob.glob(fmask), index_col=None, usecols=['col1', 'col3'])
print(df.head())
Si vous souhaitez fusionner les fichiers CSV horizontalement (en ajoutant des colonnes), utilisez axis=1
lors de l'appel de la fonction pd.concat()
:
def merged_csv_horizontally(flist, **kwargs):
return pd.concat([pd.read_csv(f, **kwargs) for f in flist], axis=1)
Lire le fichier cvs dans un bloc de données pandas lorsqu'il n'y a pas de ligne d'en-tête
Si le fichier ne contient pas de ligne d'en-tête,
Fichier:
1;str_data;12;1.4
3;str_data;22;42.33
4;str_data;2;3.44
2;str_data;43;43.34
7; str_data; 25; 23.32
vous pouvez utiliser les names
mots-clés pour fournir des noms de colonnes:
df = pandas.read_csv('data_file.csv', sep=';', index_col=0,
skip_blank_lines=True, names=['a', 'b', 'c'])
df
Out:
a b c
1 str_data 12 1.40
3 str_data 22 42.33
4 str_data 2 3.44
2 str_data 43 43.34
7 str_data 25 23.32
Utiliser HDFStore
import string
import numpy as np
import pandas as pd
générer un échantillon DF avec différents types de dtypes
df = pd.DataFrame({
'int32': np.random.randint(0, 10**6, 10),
'int64': np.random.randint(10**7, 10**9, 10).astype(np.int64)*10,
'float': np.random.rand(10),
'string': np.random.choice([c*10 for c in string.ascii_uppercase], 10),
})
In [71]: df
Out[71]:
float int32 int64 string
0 0.649978 848354 5269162190 DDDDDDDDDD
1 0.346963 490266 6897476700 OOOOOOOOOO
2 0.035069 756373 6711566750 ZZZZZZZZZZ
3 0.066692 957474 9085243570 FFFFFFFFFF
4 0.679182 665894 3750794810 MMMMMMMMMM
5 0.861914 630527 6567684430 TTTTTTTTTT
6 0.697691 825704 8005182860 FFFFFFFFFF
7 0.474501 942131 4099797720 QQQQQQQQQQ
8 0.645817 951055 8065980030 VVVVVVVVVV
9 0.083500 349709 7417288920 EEEEEEEEEE
faire un plus grand DF (10 * 100.000 = 1.000.000 lignes)
df = pd.concat([df] * 10**5, ignore_index=True)
créer (ou ouvrir un fichier HDFStore existant)
store = pd.HDFStore('d:/temp/example.h5')
enregistrer notre bloc de données dans le fichier h5
(HDFStore), en indexant les colonnes [int32, int64, string]:
store.append('store_key', df, data_columns=['int32','int64','string'])
afficher les détails du HDFStore
In [78]: store.get_storer('store_key').table
Out[78]:
/store_key/table (Table(10,)) ''
description := {
"index": Int64Col(shape=(), dflt=0, pos=0),
"values_block_0": Float64Col(shape=(1,), dflt=0.0, pos=1),
"int32": Int32Col(shape=(), dflt=0, pos=2),
"int64": Int64Col(shape=(), dflt=0, pos=3),
"string": StringCol(itemsize=10, shape=(), dflt=b'', pos=4)}
byteorder := 'little'
chunkshape := (1724,)
autoindex := True
colindexes := {
"index": Index(6, medium, shuffle, zlib(1)).is_csi=False,
"int32": Index(6, medium, shuffle, zlib(1)).is_csi=False,
"string": Index(6, medium, shuffle, zlib(1)).is_csi=False,
"int64": Index(6, medium, shuffle, zlib(1)).is_csi=False}
afficher les colonnes indexées
In [80]: store.get_storer('store_key').table.colindexes
Out[80]:
{
"int32": Index(6, medium, shuffle, zlib(1)).is_csi=False,
"index": Index(6, medium, shuffle, zlib(1)).is_csi=False,
"string": Index(6, medium, shuffle, zlib(1)).is_csi=False,
"int64": Index(6, medium, shuffle, zlib(1)).is_csi=False}
close (flush to disk) notre fichier de magasin
store.close()
Lire le journal d'accès Nginx (plusieurs guillemets)
Pour plusieurs guillemets, utilisez regex à la place de sep:
df = pd.read_csv(log_file,
sep=r'\s(?=(?:[^"]*"[^"]*")*[^"]*$)(?![^\[]*\])',
engine='python',
usecols=[0, 3, 4, 5, 6, 7, 8],
names=['ip', 'time', 'request', 'status', 'size', 'referer', 'user_agent'],
na_values='-',
header=None
)