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.

Malfet
la source

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)
Jeff
la source
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)

tanaque
la source
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 ()

Keith
la source
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
8

Utilisez le code suivant:

df.column_name = df.column_name.astype('str')
Faraz Ramtin
la source
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)
sujithramanathan
la source