Les Pandas de lecture csv comme type de chaîne
J'ai un bloc de données alpha-numériques touches de qui je veux enregistrer au format csv et de les lire plus tard. Pour diverses raisons, j'ai besoin explicitement de lire cette colonne de clé comme une chaîne de format, j'ai des touches qui sont strictement numérique ou même pire, des choses comme: 1234E5 qui Pandas interprète comme un float. Cela rend évidemment la clé complètement inutile.
Le problème est quand je spécifier une chaîne dtype pour le bloc de données ou d'une colonne de ça, j'ai juste à ordures arrière. J'ai un exemple de code ici:
df = pd.DataFrame(np.random.rand(2,2),
index=['1A', '1B'],
columns=['A', 'B'])
df.to_csv(savefile)
Le bloc de données qui ressemble à:
A B
1A 0.209059 0.275554
1B 0.742666 0.721165
Puis je l'ai lu comme suit:
df_read = pd.read_csv(savefile, dtype=str, index_col=0)
et le résultat est:
A B
B ( <
Est-ce un problème avec mon ordinateur, ou quelque chose que je fais mal ici, ou tout simplement un bug?
- Il serait bien si vous pouviez dire les "diverses raisons" pourquoi vous voulez l'enregistrer comme une chaîne de caractères. Le contexte peut être très utile pour trouver une solution plus élégante.
Vous devez vous connecter pour publier un commentaire.
Mise à jour: il a été corrigé: à partir de 0.11.1 vous passer
str
/np.str
sera équivalent à l'utilisation deobject
.Utiliser l'objet dtype:
ou, mieux encore, il suffit de ne pas spécifier un dtype:
mais en contournant le type de sniffer et vraiment de retour seulement chaînes nécessite un hacky utilisation de
converters
:où
100
est un nombre supérieur ou égal à votre total nombre de colonnes.Il est préférable d'éviter les str dtype, voir par exemple ici.
read_csv
doit a) montée sur un invalide passé dtype, et b) à traduirestr
dtype àobject
, ouvrez un problème?dtype=object
(et pas index_col) a résolu tous mes problèmes de zéros en train de disparaître.dtype
n'est pas assez. Par exemple,df.applymap(lambda x: x.strip())
déclenche une erreurAttributeError: ("'float' object has no attribute 'strip'", 'occurred at index A')
parce que les pandas contraintobject
àfloat
quelque part sur la route.na_filter=False
paramètre deread_csv
.Comme Anton T a dit dans son commentaire,
pandas
, de façon aléatoire, tournerobject
types dansfloat
types à l'aide de son type de sniffer, même vous passerdtype=object
,dtype=str
, oudtype=np.str
.Puisque vous pouvez passer d'un dictionnaire de fonctions où la clé est un index de colonne et la valeur est une fonction convertisseur, vous pouvez faire quelque chose comme ceci (par exemple, pour 100 colonnes).
Vous pouvez même passer
range(0, N)
pour N beaucoup plus grand que le nombre de colonnes si vous ne savez pas combien de colonnes de vous lire.Utiliser un convertisseur qui s'applique à n'importe quelle colonne, si vous ne connaissez pas les colonnes avant de la main: