Converter uma coluna dentro do dataframe do pandas de int em string


107

Eu tenho um dataframe em pandas com colunas de dados int e str mistos. Quero concatenar primeiro as colunas dentro do dataframe. Para fazer isso, tenho que converter uma intcoluna para str. Tentei fazer o seguinte:

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

ou

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

mas em ambos os casos não está funcionando e estou recebendo um erro dizendo "não é possível concatenar objetos 'str' e 'int'". Concatenar duas strcolunas está funcionando perfeitamente bem.


Respostas:


138
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

Converter uma 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ão se esqueça de atribuir o resultado de volta:

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

Converter todo o quadro

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
Eu realmente não entendo o porquê, mas mtrx ['X.3']. Apply (str) também não funciona para mim :( dtype ainda mostra int64. O dataframe para 23177 linha e coluna X.3 tem apenas números. Em [21]: mtrx ['X.3']. Dtype Out [21]: dtype ('int64')
Malfet

0.7.0, vem com python 2.7 no sistema Ubuntu
Malfet

a versão atual é 0,12, você deve atualizar.
Jeff

df ['A']. apply (str) não está funcionando. mas df.column_name = df.column_name.astype (str) funciona. Não faço ideia do porquê.
Dmitry Konovalov

1
@DmitryKonovalov em strings python são imutáveis, então sempre que você manipular os dados, você deve colocar o resultado de volta na variável.
Sriram Arvind Lakshmanakumar de

92

Altere o tipo de dados da coluna DataFrame:

Para int:

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

Para str:

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


7
Isso é atraente, mas é cerca de 4x mais lento do que apply(str)@Jeff, em meu teste de uso pd.Series(np.arange(1000000)).
John Zwinck 01 de

2
Isso funciona para mim. df['A'] = df['A'].apply(str)também funciona. A resposta fornecida por @Jeff não funciona para mim.
tommy.carstensen

1
Em relação ao comentário de @JohnZwinck, usando Python3 parece ser 2x mais rápido de usar em apply()vez 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

Aviso : as duas soluções fornecidas ( astype () e apply () ) não preservam os valores NULL na forma 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()

Acredito que isso seja corrigido pela implementação de to_string ()


1
to_string permite que você escolha o manuseio de Nan, por exemplo, para retornar uma string vazia ao invés de 'Nan'
seanv507

1
(Eu não estava discordando, apenas expandindo o que você disse) - queria dizer +1
seanv507

8

Use o seguinte código:

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

0

Apenas para uma referência adicional.

Todas as respostas acima funcionarão no caso de um quadro de dados. Mas se você estiver usando lambda ao criar / modificar uma coluna, isso não funcionará, porque lá ele é considerado um atributo int em vez de uma série de pandas. Você tem que usar str (target_attribute) para torná-lo uma string. Consulte o exemplo abaixo.

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)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.