Conversion d'une colonne dans la trame de données Pandas de int en chaîne


108

J'ai un dataframe dans les pandas avec des colonnes de données mixtes int et str. Je veux concaténer d'abord les colonnes dans le dataframe. Pour ce faire, je dois convertir une intcolonne en str. J'ai essayé de faire comme suit:

mtrx['X.3'] = mtrx.to_string(columns = ['X.3'])

ou

mtrx['X.3'] = mtrx['X.3'].astype(str)

mais dans les deux cas cela ne fonctionne pas et j'obtiens une erreur disant "impossible de concaténer les objets 'str' et 'int'". La concaténation de deux strcolonnes fonctionne parfaitement.


Réponses:


140
In [16]: df = DataFrame(np.arange(10).reshape(5,2),columns=list('AB'))

In [17]: df
Out[17]: 
   A  B
0  0  1
1  2  3
2  4  5
3  6  7
4  8  9

In [18]: df.dtypes
Out[18]: 
A    int64
B    int64
dtype: object

Convertir une série

In [19]: df['A'].apply(str)
Out[19]: 
0    0
1    2
2    4
3    6
4    8
Name: A, dtype: object

In [20]: df['A'].apply(str)[0]
Out[20]: '0'

N'oubliez pas de renvoyer le résultat:

df['A'] = df['A'].apply(str)

Convertir le cadre entier

In [21]: df.applymap(str)
Out[21]: 
   A  B
0  0  1
1  2  3
2  4  5
3  6  7
4  8  9

In [22]: df.applymap(str).iloc[0,0]
Out[22]: '0'

df = df.applymap(str)

3
Je ne comprends vraiment pas pourquoi, mais mtrx ['X.3']. Apply (str) ne fonctionne pas non plus pour moi :( dtype affiche toujours int64. Le dataframe pour la ligne 23177 et la colonne X.3 n'a que des nombres. Dans [21]: mtrx ['X.3']. Dtype Out [21]: dtype ('int64')
Malfet

0.7.0, livré avec python 2.7 sur le système Ubuntu
Malfet

la version actuelle est 0.12, vous devriez mettre à jour.
Jeff

df ['A']. apply (str) ne fonctionne pas. mais df.column_name = df.column_name.astype (str) fonctionne. Je ne sais pas pourquoi.
Dmitry Konovalov

1
@DmitryKonovalov en python, les chaînes sont immuables, donc chaque fois que vous manipulez les données, vous devez remettre le résultat dans la variable.
Sriram Arvind Lakshmanakumar

92

Modifier le type de données de la colonne DataFrame:

À int:

df.column_name = df.column_name.astype(np.int64)

À str:

df.column_name = df.column_name.astype(str)


7
C'est attrayant, mais c'est environ 4x plus lent que apply(str)de @Jeff, dans mon test en utilisant pd.Series(np.arange(1000000)).
John Zwinck

2
Cela fonctionne pour moi. df['A'] = df['A'].apply(str)fonctionne également. La réponse fournie par @Jeff ne fonctionne pas pour moi.
tommy.carstensen

1
En ce qui concerne le commentaire de @ JohnZwinck, en utilisant Python3, il semble être plus 2 fois plus rapide à utiliser apply()au lieu de astype(): timeit.Timer ('c.apply (str)', setup = 'import pandas as pd; c = pd.Series (range ( 1000)) '). Timeit (1000) >>> 0.41499893204309046 >>> timeit.Timer (' c.astype (str) ', setup =' import pandas as pd; c = pd.Series (range (1000)) ' ) .timeit (1000) 0.8004439630312845
hamx0r

15

Attention : les deux solutions données ( astype () et apply () ) ne conservent pas les valeurs NULL sous la forme nan ou None.

import pandas as pd
import numpy as np

df = pd.DataFrame([None,'string',np.nan,42], index=[0,1,2,3], columns=['A'])

df1 = df['A'].astype(str)
df2 =  df['A'].apply(str)

print df.isnull()
print df1.isnull()
print df2.isnull()

Je pense que cela est corrigé par l'implémentation de to_string ()


1
to_string vous permet de choisir la gestion de Nan, par exemple pour retourner une chaîne vide plutôt que «Nan»
seanv507

1
(Je n'étais pas en désaccord, je développais simplement ce que vous avez dit) - avait voulu dire +1
seanv507


0

Juste pour une référence supplémentaire.

Toutes les réponses ci-dessus fonctionneront dans le cas d'une trame de données. Mais si vous utilisez lambda lors de la création / modification d'une colonne, cela ne fonctionnera pas, car il est considéré comme un attribut int au lieu d'une série pandas. Vous devez utiliser str (target_attribute) pour en faire une chaîne. Veuillez vous référer à l'exemple ci-dessous.

def add_zero_in_prefix(df):
    if(df['Hour']<10):
        return '0' + str(df['Hour'])

data['str_hr'] = data.apply(add_zero_in_prefix, axis=1)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.