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.
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:~$
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à!
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.
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.
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.