web-dev-qa-db-fra.com

Pandas csv-import: conserver les zéros non significatifs dans une colonne

J'importe des données d'étude dans une trame de données Pandas en utilisant read_csv.

Mes codes de sujet sont 6 chiffres codant, entre autres, le jour de naissance. Pour certains de mes sujets, cela se traduit par un code avec un zéro en tête (par exemple "010816").

Lorsque j'importe dans Pandas, le zéro de tête est supprimé et la colonne est formatée comme int64.

Existe-t-il un moyen d'importer cette colonne inchangée, peut-être sous forme de chaîne?

J'ai essayé d'utiliser un convertisseur personnalisé pour la colonne, mais cela ne fonctionne pas - il semble que la conversion personnalisée ait lieu avant Pandas convertit en int.

38
user1802883

Comme indiqué dans cette question/réponse par Lev Landa , il pourrait y avoir une solution simple pour utiliser l'option converters pour une certaine colonne dans read_csv une fonction.

converters={'column_name': lambda x: str(x)}

Vous pouvez vous référer à plus d'options de read_csv funtion dans pandas.io.parsers.read_csv documentation .

Disons que j'ai un fichier csv projects.csv comme ci-dessous:

project_name,project_id
Some Project,000245
Another Project,000478

Comme par exemple ci-dessous, le code coupe les zéros en tête:

import csv
from pandas import read_csv

dataframe = read_csv('projects.csv')
print dataframe

Résultat:

me@ubuntu:~$ python test_dataframe.py 
      project_name  project_id
0     Some Project         245
1  Another Project         478
me@ubuntu:~$

Exemple de code de solution:

import csv
from pandas import read_csv

dataframe = read_csv('projects.csv', converters={'project_id': lambda x: str(x)})
print dataframe

Résultat recherché:

me@ubuntu:~$ python test_dataframe.py 
      project_name project_id
0     Some Project     000245
1  Another Project     000478
me@ubuntu:~$
36
baltasvejas

voici une solution plus courte, robuste et pleinement fonctionnelle:

définissez simplement un mappage (dictionnaire) entre les noms de variables et le type de données souhaité:

dtype_dic= {'subject_id': str, 
            'subject_number' : 'float'}

utilisez ce mappage avec pd.read_csv():

df = pd.read_csv(yourdata, dtype = dtype_dic)

et voilà!

16
ℕʘʘḆḽḘ

Si vous avez beaucoup de colonnes et que vous ne savez pas lesquelles contiennent des zéros non significatifs qui pourraient être manqués, ou vous pourriez avoir juste besoin d'automatiser votre code. Vous pouvez effectuer les opérations suivantes:

df = pd.read_csv("your_file.csv", nrows=1) # Just take the first row to extract the columns' names
col_str_dic = {column:str for column in list(df)}
df = pd.read_csv("your_file.csv", dtype=col_str_dic) # Now you can read the compete file

Vous pourriez également faire:

df = pd.read_csv("your_file.csv", dtype=str)

En faisant cela, vous aurez toutes vos colonnes sous forme de chaînes et vous ne perdrez aucun zéros de tête.

7
Erick Rodriguez

Je ne pense pas que vous puissiez spécifier un type de colonne comme vous le souhaitez (s'il n'y a pas eu de modifications récentes et si le nombre à 6 chiffres n'est pas une date que vous pouvez convertir en datetime). Vous pouvez essayer d'utiliser np.genfromtxt() et créer le DataFrame à partir de là.

EDIT: Jetez un oeil à Wes Mckinney's blog , il pourrait y avoir quelque chose pour vous. Il semble qu'il y ait un nouvel analyseur de pandas 0.10 à venir en novembre.

0
root

Vous pouvez utiliser converters pour convertir le nombre en largeur fixe si vous connaissez la largeur.

Par exemple, si la largeur est de 5, alors

data = pd.read_csv('text.csv', converters={'column1': lambda x: f"{x:05}"})

Ça fera l'affaire. Cela fonctionne pour les pandas == 0.23.0 et aussi read_Excel.

Python3.6 ou supérieur requis.

0
secsilm