web-dev-qa-db-fra.com

Pandas read_csv dtype lit toutes les colonnes mais peu comme chaîne

J'utilise Pandas pour lire un tas de CSV. Passage d'un paramètre json à dtype pour indiquer à pandas quelles colonnes lire comme chaîne au lieu de la valeur par défaut :

dtype_dic= { 'service_id':str, 'end_date':str, ... }
feedArray = pd.read_csv(feedfile , dtype = dtype_dic)

Dans mon scénario, tous les colonnes, à l'exception de quelques unes spécifiques, doivent être lues sous forme de chaînes. Donc, au lieu de définir plusieurs colonnes comme str dans dtype_dic _, Je voudrais définir uniquement mes choix comme int ou float. Y-a-t-il un moyen de faire ça?

Il s’agit d’une boucle parcourant divers fichiers CSV avec des colonnes différentes. Il est donc possible de convertir directement une colonne après avoir lu l’ensemble du csv sous forme de chaîne (dtype=str), ne serait pas facile car je ne saurais pas immédiatement quelles colonnes csv possède. (Je préférerais passer cet effort à définir toutes les colonnes du type json!)

Edit: Mais s’il existe un moyen de traiter la liste des noms de colonne à convertir en nombre sans erreur, si cette colonne n’est pas présente dans csv, alors oui, ce sera une solution valable, s’il n’ya pas d’autre moyen de le faire. cela au stade de la lecture csv lui-même.

Remarque: cela sonne comme une question précédemment posée mais les réponses y sont allées sur un chemin très différent (lié à bool) qui ne s'applique pas à cette question. Les pls ne marquent pas comme dupliquer!

20
Nikhil VJ

EDIT - désolé, j'ai mal interprété votre question. Mis à jour ma réponse.

Vous pouvez lire l'intégralité du csv sous forme de chaînes, puis convertir ensuite vos colonnes souhaitées en d'autres types, comme ceci:

df = pd.read_csv('/path/to/file.csv', dtype=str)
# example df; yours will be from pd.read_csv() above
df = pd.DataFrame({'A': ['1', '3', '5'], 'B': ['2', '4', '6'], 'C': ['x', 'y', 'z']})
types_dict = {'A': int, 'B': float}
for col, col_type in types_dict.items():
    df[col] = df[col].astype(col_type)

Une autre approche, si vous voulez vraiment spécifier les types appropriés pour toutes les colonnes lors de la lecture du fichier et ne pas les modifier après: lisez uniquement les noms des colonnes (pas de lignes), puis utilisez ceux-ci pour indiquer quelles colonnes doivent être des chaînes.

col_names = pd.read_csv('file.csv', nrows=0).columns
types_dict = {'A': int, 'B': float}
types_dict.update({col: str for col in col_names if col not in types_dict})
pd.read_csv('file.csv', dtype=types_dict)
27
Nathan