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 exemple pd.read_csv('data_file.csv', sep=';')

  • index_col Avec index_col = n ( n entier) vous dire pandas géants à utiliser la colonne n 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. Utilisez skip_blank_lines=False pour inclure les lignes vides (elles seront remplies avec les valeurs NaN )

    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 et 1 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
                )


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow