Python pandas: sortie dataframe à csv avec entiers
J'ai un pandas.DataFrame
que je souhaite exporter vers un fichier CSV. Cependant, les pandas semble écrire certaines des valeurs que float
au lieu de int
types. Je ne pouvais pas ne pas trouver comment changer ce comportement.
La construction d'un bloc de données:
df = pandas.DataFrame(columns=['a','b','c','d'], index=['x','y','z'], dtype=int)
x = pandas.Series([10,10,10], index=['a','b','d'], dtype=int)
y = pandas.Series([1,5,2,3], index=['a','b','c','d'], dtype=int)
z = pandas.Series([1,2,3,4], index=['a','b','c','d'], dtype=int)
df.loc['x']=x; df.loc['y']=y; df.loc['z']=z
Vue:
>>> df
a b c d
x 10 10 NaN 10
y 1 5 2 3
z 1 2 3 4
À l'exportation:
>>> df.to_csv('test.csv', sep='\t', na_rep='0', dtype=int)
>>> for l in open('test.csv'): print l.strip('\n')
a b c d
x 10.0 10.0 0 10.0
y 1 5 2 3
z 1 2 3 4
Pourquoi les dizaines ont un point zéro ?
Sûr, je pourrais juste coller cette fonction dans mon pipeline pour la reconversion de l'ensemble du fichier CSV, mais il me semble inutile:
def lines_as_integer(path):
handle = open(path)
yield handle.next()
for line in handle:
line = line.split()
label = line[0]
values = map(float, line[1:])
values = map(int, values)
yield label + '\t' + '\t'.join(map(str,values)) + '\n'
handle = open(path_table_int, 'w')
handle.writelines(lines_as_integer(path_table_float))
handle.close()
source d'informationauteur xApple
Vous devez vous connecter pour publier un commentaire.
C'est un "gotcha" dans les pandas (Soutien à l'entier NA)où les colonnes de type entier avec NaNs sont convertis à flotteurs.
La réponse que je cherchais une légère variation de ce que @Jeff proposé dans sa réponse. Le crédit va à lui. C'est ce qui a résolu mon problème en fin de compte de référence:
Le problème est que depuis que vous êtes à l'attribution des choses par des lignes, mais dtypes sont regroupés par colonnes, de sorte que les choses se lancer pour
object
dtype, ce qui n'est pas une bonne chose, vous perdez tout l'efficacité. Une façon est de convertir ce qui va le contraindre à flotteur/int dtype en tant que de besoin.Que nous avons répondu à une autre question, si vous construisez l'image à la fois (ou construire colonne par colonne) cette étape ne sera pas nécessaire