web-dev-qa-db-fra.com

Pandas Python: comment spécifier les types de données lors de la lecture d'un fichier Excel?

J'importe un fichier Excel dans une base de données de pandas avec la fonction pandas.read_Excel().

Une des colonnes est la clé primaire du tableau: ce sont tous des nombres, mais ils sont stockés sous forme de texte (le petit triangle vert en haut à gauche des cellules Excel le confirme). 

Cependant, lorsque j'importe le fichier dans un cadre de données pandas, la colonne est importée sous forme de fichier flottant. Cela signifie que, par exemple, «0614» devient 614.

Est-il possible de spécifier le type de données lors de l'importation d'une colonne? Je comprends que cela est possible lors de l'importation de fichiers CSV, mais je n'ai rien trouvé dans la syntaxe de read_Excel()

La seule solution à laquelle je peux penser est d'ajouter une lettre arbitraire au début du texte (en convertissant "0614" en "A0614") dans Excel pour vous assurer que la colonne est importée en tant que texte, puis en coupant le "A" en python, je peux donc le faire correspondre à d'autres tables que j'importe de SQL.

30

Vous venez de spécifier des convertisseurs. J'ai créé une feuille de calcul Excel de la structure suivante:

names   ages
bob     05
tom     4
suzy    3

Où la colonne "âges" est mise en forme en tant que chaînes. Charger: 

import pandas as pd

df = pd.read_Excel('Book1.xlsx',sheetname='Sheet1',header=0,converters={'names':str,'ages':str})
>>> df
       names ages
   0   bob   05
   1   tom   4
   2   suzy  3
62
tnknepp

À partir de v0.20.0, le mot clé dtype dans read_Excel() function peut être utilisé pour spécifier les types de données à appliquer aux colonnes, tout comme il existe pour read_csv() cas.

Utiliser les arguments converters et dtype ensemble sur le même nom de colonne ferait en sorte que le dernier soit occulté et que le premier acquière une préférence.


1) Afin de ne pas interpréter le dtypes mais de transmettre tout le contenu de ses colonnes tels qu’ils étaient à l’origine dans le fichier, nous pourrions définir cet argument sur str ou object afin de ne pas altérer nos données. (Un cas de ce genre serait des zéros non significatifs qui seraient perdus autrement)

pd.read_Excel('file_name.xlsx', dtype=str)            # (or) dtype=object

2) Il prend même en charge un mappage dict dans lequel keys constituent les noms de colonne et values son type de données respectif à définir, en particulier si vous souhaitez modifier le dtype pour un sous-ensemble de toutes les colonnes.

# Assuming data types for `a` and `b` columns to be altered
pd.read_Excel('file_name.xlsx', dtype={'a': np.float64, 'b': np.int32})
12
Nickil Maveli

La fonction read_Excel () a un argument convertisseurs, dans lequel vous pouvez appliquer des fonctions à saisir dans certaines colonnes. Vous pouvez l'utiliser pour les conserver sous forme de chaînes . Documentation :

Dict de fonctions pour la conversion de valeurs dans certaines colonnes. Les clés peuvent être des entiers ou des étiquettes de colonne. Les valeurs sont des fonctions qui prennent un argument d'entrée, le contenu de la cellule Excel, et renvoient le contenu transformé.

Exemple de code:

pandas.read_Excel(my_file, converters = {my_str_column: str})
8
Nix G-D

Si vous ne connaissez pas le nombre et le nom des colonnes dans le cadre de données, cette méthode peut être pratique:

column_list = []
df_column = pd.read_Excel(file_name, 'Sheet1').columns
for i in df_column:
    column_list.append(i)
converter = {col: str for col in column_list} 
df_actual = pd.read_Excel(file_name, converters=converter)

où liste_colonne est la liste de vos noms de colonne.

5
Tango

Si votre clé a un nombre fixe de chiffres, vous devriez probablement stocker sous forme de texte plutôt que sous forme de données numériques. Vous pouvez utiliser l'argument converters ou read_Excel pour cela.

Ou, si cela ne fonctionne pas, manipulez simplement vos données une fois qu'elles ont été lues dans votre cadre de données:

df['key_zfill'] = df['key'].astype(str).str.zfill(4)

  names   key key_zfill
0   abc     5      0005
1   def  4962      4962
2   ghi   300      0300
3   jkl    14      0014
4   mno    20      0020
0
jpp