Mengonversi kolom dalam pandas dataframe dari int menjadi string


107

Saya memiliki kerangka data dalam panda dengan kolom data int dan str campuran. Saya ingin menggabungkan kolom pertama di dalam dataframe. Untuk melakukan itu saya harus mengubah intkolom menjadi str. Saya sudah mencoba melakukan sebagai berikut:

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

atau

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

tetapi dalam kedua kasus itu tidak berfungsi dan saya mendapatkan kesalahan yang mengatakan "tidak dapat menggabungkan objek 'str' dan 'int'". Menggabungkan dua strkolom bekerja dengan baik.


Jawaban:


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

Ubah seri

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'

Jangan lupa untuk mengembalikan hasilnya:

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

Ubah keseluruhan frame

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
Saya benar-benar tidak mengerti mengapa, tetapi mtrx ['X.3']. Apply (str) juga tidak berfungsi untuk saya :( dtype masih menunjukkan int64. Dataframe untuk baris 23177 dan kolom X.3 hanya mendapat angka. Dalam [21]: mtrx ['X.3']. Dtype Out [21]: dtype ('int64')
Malfet

0.7.0, hadir dengan python 2.7 pada sistem Ubuntu
Malfet

versi saat ini adalah 0,12, Anda harus meningkatkan.
Jeff

df ['A']. apply (str) tidak bekerja. tetapi df.column_name = df.column_name.astype (str) berfungsi. Tidak tahu kenapa.
Dmitry Konovalov

1
@DmitryKonovalov dalam string python tidak dapat diubah, jadi setiap kali Anda memanipulasi data, Anda harus mengembalikan hasilnya ke variabel.
Sriram Arvind Lakshmanakumar

92

Ubah tipe data kolom DataFrame:

Ke int:

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

Untuk str:

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


7
Ini menarik, tetapi sekitar 4x lebih lambat daripada apply(str)dari @Jeff, dalam pengujian saya menggunakan pd.Series(np.arange(1000000)).
John Zwinck

2
Ini berhasil untuk saya. df['A'] = df['A'].apply(str)juga bekerja. Jawaban yang diberikan oleh @Jeff tidak berhasil untuk saya.
tommy.carstensen

1
Mengenai komentar @ JohnZwinck, menggunakan Python3 tampaknya lebih seperti 2x lebih cepat untuk digunakan apply()daripada 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

Peringatan : Kedua solusi yang diberikan ( astype () dan apply () ) tidak mempertahankan nilai NULL baik dalam bentuk nan atau 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()

Saya yakin ini diperbaiki dengan penerapan to_string ()


1
to_string memungkinkan Anda untuk memilih penanganan Nan misalnya untuk mengembalikan string kosong daripada 'Nan'
seanv507

1
(Saya tidak setuju, hanya memperluas apa yang Anda katakan) - ingin mengatakan +1
seanv507


0

Sekadar referensi tambahan.

Semua jawaban di atas akan berfungsi dalam kasus kerangka data. Tetapi jika Anda menggunakan lambda saat membuat / memodifikasi kolom, ini tidak akan berfungsi, Karena di sana dianggap sebagai atribut int daripada seri pandas. Anda harus menggunakan str (target_attribute) untuk menjadikannya sebagai string. Silakan lihat contoh di bawah ini.

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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.