1
votes

Pourquoi les pandas suppriment-ils le zéro non significatif lors de l'écriture dans un csv?

J'ai un dataframe qui a une colonne appelée «CBG» avec des nombres comme valeur de chaîne.

combine_acs_merge.to_csv(new_out_csv, sep=',')
>>> CBG: [0: 10010221101, ...]

Lorsque je l'écris dans un fichier csv, les 'O' de début sont supprimés:

    CBG             acs_total_persons   acs_total_housing_units
0   010010211001    1925                1013
1   010030114011    2668                1303
2   010070100043    930                 532    

C'est déjà une chaîne; comment puis-je empêcher la suppression du zéro de début dans le fichier .csv


2 commentaires

Les pandas le suppriment-ils? Ou l'ouvrez-vous dans Excel et est-ce qu'Excel l'interprète comme un nombre et supprime le zéro non significatif?


Essayez de l'écrire dans un fichier .txt: combine_acs_merge.to_csv (testFile.txt, sep = ',', mode = 'a') et voyez si les zéros sont toujours là. Erfan a probablement raison de supposer qu'Excel supprime le zéro lorsque vous ouvrez le fichier.


3 Réponses :


1
votes

Les pandas ne suppriment pas les zéros remplis. Vous aimez voir cela lors de l'ouverture dans Excel. Ouvrez le csv dans un éditeur de texte comme notepad ++ et vous verrez qu'ils sont toujours remplis de zéro.


0 commentaires

5
votes

Prenons un exemple:

Voici votre exemple de DataFrame:

$ cat CBG.csv
,CBG,acs_total_housing_units,acs_total_persons
0,010010211001,1013,1925
1,010030114011,1303,2668
2,010070100043,532,930

Considérant le num comme un int que vous pouvez convertir en str().

>>> df = pd.DataFrame({'CBG': ["010010211001", "010030114011", "010070100043"],
...                    'acs_total_persons': [1925, 2668, 930],
...                    'acs_total_housing_units': [1013, 1303, 532]})
>>>
>>> df
            CBG  acs_total_housing_units  acs_total_persons
0  010010211001                     1013               1925
1  010030114011                     1303               2668
2  010070100043                      532                930
>>> df.to_csv("CBG.csv")

Sortie:

$ cat sheet.csv

Vous trouverez les zéros non significatifs sont intacts.

pd.read_csv('test.csv', dtype=str)

OU, si vous lisez d'abord les données de csv, utilisez ensuite belwo ..

,col1,num
0,One,011
1,two,0123
2,three,0122
3,four,0333

Cependant, si votre colonne CBG déjà str alors elle devrait être simple ..

>>> df["num"] = df["num"].astype(str)
>>> df.to_csv("datasheet.csv")

résultat:

>>> df
    col1   num
0    One   011
1    two  0123
2  three  0122
3   four  0333


0 commentaires

1
votes

Lors de la lecture d'un fichier CSV, pandas essaie de convertir les valeurs de chaque colonne en un type de données comme bon lui semble. S'il voit une colonne qui ne contient que des chiffres, il définira le dtype de cette colonne sur int64. Cela convertit "010010211001" en 10010211001.

Si vous ne voulez pas que des conversions de type de données se produisent, spécifiez dtype = str lors de la lecture dans le fichier CSV. Selon la documentation pandas pour read_csv https: // pandas. pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html :

dtype : Type name or dict of column -> type, optional

    Data type for data or columns. E.g. {‘a’: np.float64, ‘b’: np.int32, ‘c’: ‘Int64’} Use str or object
    together with suitable na_values settings to preserve and not interpret dtype. If
    converters are specified, they will be applied INSTEAD of dtype conversion.


0 commentaires