J'ai lu quelque chose sur une limitation Python 2 par rapport au to_csv des Pandas (... etc ...). Est-ce que je l'ai frappé? Je suis sur Python 2.7.3
Il en résulte des caractères de corbeille pour ≥ et - lorsqu'ils apparaissent dans des chaînes. Mis à part cela, l'exportation est parfaite.
df.to_csv("file.csv", encoding="utf-8")
Y a-t-il une solution de contournement?
df.head () est la suivante:
demography Adults ≥49 yrs Adults 18−49 yrs at high risk|| \
state
Alabama 32.7 38.6
Alaska 31.2 33.2
Arizona 22.9 38.8
Arkansas 31.2 34.0
California 29.8 38.8
la sortie csv est-ce
state, Adults ≥49 yrs, Adults 18−49 yrs at high risk||
0, Alabama, 32.7, 38.6
1, Alaska, 31.2, 33.2
2, Arizona, 22.9, 38.8
3, Arkansas,31.2, 34
4, California,29.8, 38.8
le code entier est le suivant:
import pandas
import xlrd
import csv
import json
df = pandas.DataFrame()
dy = pandas.DataFrame()
# first merge all this xls together
workbook = xlrd.open_workbook('csv_merger/vaccoverage.xls')
worksheets = workbook.sheet_names()
for i in range(3,len(worksheets)):
dy = pandas.io.Excel.read_Excel(workbook, i, engine='xlrd', index=None)
i = i+1
df = df.append(dy)
df.index.name = "index"
df.columns = ['demography', 'area','state', 'month', 'rate', 'moe']
#Then just grab month = 'May'
may_mask = df['month'] == "May"
may_df = (df[may_mask])
#then delete some columns we dont need
may_df = may_df.drop('area', 1)
may_df = may_df.drop('month', 1)
may_df = may_df.drop('moe', 1)
print may_df.dtypes #uh oh, it sees 'rate' as type 'object', not 'float'. Better change that.
may_df = may_df.convert_objects('rate', convert_numeric=True)
print may_df.dtypes #that's better
res = may_df.pivot_table('rate', 'state', 'demography')
print res.head()
#and this is going to spit out an array of Objects, each Object a state containing its demographics
res.reset_index().to_json("thejson.json", orient='records')
#and a .csv for good measure
res.reset_index().to_csv("thecsv.csv", orient='records', encoding="utf-8")
Votre "mauvaise" sortie est UTF-8 affichée comme CP1252.
Sous Windows, de nombreux éditeurs supposent le codage ANSI par défaut (CP1252 sous Windows américain) au lieu d'UTF-8 s'il n'y a pas de caractère de marque d'ordre d'octets (BOM) au début du fichier. Alors qu'une nomenclature n'a pas de sens pour le codage UTF-8, sa présence codée UTF-8 sert de signature pour certains programmes. Par exemple, Excel de Microsoft Office l'exige même sur les systèmes d'exploitation non Windows. Essayer:
df.to_csv('file.csv',encoding='utf-8-sig')
Cet encodeur ajoutera la nomenclature.