Conversione di una colonna all'interno di pandas dataframe da int a stringa


107

Ho un dataframe in panda con colonne di dati miste int e str. Voglio concatenare prima le colonne all'interno del dataframe. Per farlo devo convertire una intcolonna in str. Ho provato a fare quanto segue:

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

o

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

ma in entrambi i casi non funziona e ricevo un errore che dice "impossibile concatenare oggetti 'str' e 'int'". La concatenazione di due strcolonne funziona perfettamente.


Risposte:


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

Converti una serie

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'

Non dimenticare di assegnare nuovamente il risultato:

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

Converti l'intero fotogramma

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
Non capisco davvero perché, ma mtrx ['X.3']. Apply (str) non funziona neanche per me :( dtype mostra ancora int64. Il dataframe per la riga 23177 e la colonna X.3 hanno solo numeri. [21]: mtrx ['X.3']. Dtype Out [21]: dtype ('int64')
Malfet

0.7.0, fornito con Python 2.7 sul sistema Ubuntu
Malfet

la versione attuale è la 0.12, dovresti aggiornarla.
Jeff

df ['A']. apply (str) non funziona. ma df.column_name = df.column_name.astype (str) funziona. Non ho idea del perché.
Dmitry Konovalov

1
@DmitryKonovalov nelle stringhe Python non sono modificabili, quindi ogni volta che manipoli i dati, devi rimettere il risultato nella variabile.
Sriram Arvind Lakshmanakumar

92

Modifica il tipo di dati della colonna DataFrame:

Per int:

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

Per str:

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


7
Questo è interessante, ma è circa 4 volte più lento rispetto apply(str)a @Jeff, nel mio test utilizzando pd.Series(np.arange(1000000)).
John Zwinck

2
Questo funziona per me. df['A'] = df['A'].apply(str)funziona anche. La risposta fornita da @Jeff non funziona per me.
tommy.carstensen

1
Per quanto riguarda il commento di @ JohnZwinck, l'utilizzo di Python3 sembra essere più veloce di 2x apply()invece di 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

Avvertenza : entrambe le soluzioni fornite ( astype () e apply () ) non conservano i valori NULL né nella forma nan né nella forma 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()

Credo che questo sia stato risolto dall'implementazione di to_string ()


1
to_string ti consente di scegliere la gestione di Nan, ad esempio per restituire una stringa vuota invece di 'Nan'
seanv507

1
(Non ero in disaccordo, mi
limitavo ad

8

Usa il codice seguente:

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

0

Solo per un ulteriore riferimento.

Tutte le risposte precedenti funzioneranno in caso di frame di dati. Ma se stai usando lambda durante la creazione / modifica di una colonna, questo non funzionerà, perché lì è considerato un attributo int invece della serie di panda. Devi usare str (target_attribute) per renderlo come una stringa. Fare riferimento all'esempio di seguito.

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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.