Pandas veri çerçevesi içindeki bir sütunu int'den dizeye dönüştürme


109

Pandalarda karışık int ve str veri sütunlarına sahip bir veri çerçevem ​​var. Önce veri çerçevesi içindeki sütunları birleştirmek istiyorum. Bunu yapmak için bir intsütunu 'a dönüştürmem gerekiyor str. Şu şekilde yapmaya çalıştım:

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

veya

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

ama her iki durumda da çalışmıyor ve "'str' ve 'int' nesnelerini birleştiremiyorum" diyen bir hata alıyorum. İki strsütunu birleştirmek mükemmel bir şekilde çalışıyor.


Yanıtlar:


142
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

Bir seriyi dönüştür

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'

Sonucu geri atamayı unutmayın:

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

Tüm çerçeveyi dönüştür

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
Nedenini gerçekten anlamıyorum, ancak mtrx ['X.3']. Apply (str) benim için de çalışmıyor :( dtype hala int64 gösteriyor. 23177 satırı ve X.3 sütunu için veri çerçevesi yalnızca sayıları içeriyor. [21]: mtrx ['X.3']. Dtype Out [21]: dtype ('int64')
Malfet

0.7.0, Ubuntu sisteminde python 2.7 ile gelin
Malfet

mevcut sürüm 0.12, yükseltmelisiniz.
Jeff

df ['A']. apply (str) çalışmıyor. ancak df.column_name = df.column_name.astype (str) çalışır. Neden olduğuna dair hiçbir fikrim yok.
Dmitry Konovalov

1
Python dizelerindeki @DmitryKonovalov değişmezdir, bu nedenle verileri her değiştirdiğinizde, sonucu değişkene geri koymanız gerekir.
Sriram Arvind Lakshmanakumar

92

DataFrame sütununun veri türünü değiştirin:

İnt için:

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

Str için:

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


7
Bu çekici, ancak apply(str)kullandığım testte @ Jeff'ten yaklaşık 4 kat daha yavaş pd.Series(np.arange(1000000)).
John Zwinck

2
Bu benim için çalışıyor. df['A'] = df['A'].apply(str)ayrıca çalışır. @ Jeff tarafından sağlanan cevap benim için çalışmıyor.
tommy.carstensen

1
Kullanımını daha 2x gibi hızlı olarak görünüyor Python3 kullanarak, JohnZwinck yorumuna @ İlişkin apply()yerine astype(): timeit.Timer ( 'c.apply (str)' setup = 'pd olarak ithal pandalar; c = pd.Series (aralık ( 1000)) '). Timeit (1000) >>> 0.41499893204309046 >>> timeit.Timer (' c.astype (str) ', setup =' pandaları pd olarak içe aktar; c = pd.Series (aralık (1000)) ' ) .timeit (1000) 0.8004439630312845
hamx0r

15

Uyarı : Verilen her iki çözüm de ( astype () ve apply () ) nan veya None formunda NULL değerleri korumaz.

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()

Bunun to_string () uygulamasıyla düzeltildiğine inanıyorum


1
to_string, Nan'ın işlenmesini seçmenize izin verir, örneğin 'Nan' yerine boş dizge döndürmek için
seanv507

1
(Aynı fikirde değildim, sadece söylediklerini genişletiyorum) - +1 demek istemiştim
seanv507

8

Aşağıdaki kodu kullanın:

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

0

Sadece ek bir referans için.

Veri çerçevesi olması durumunda yukarıdaki cevapların tümü işe yarayacaktır. Ancak bir sütun oluştururken / değiştirirken lambda kullanıyorsanız bu işe yaramaz, çünkü orada pandalar dizisi yerine bir int özniteliği olarak kabul edilir. Bir dizge yapmak için str (target_attribute) kullanmanız gerekir. Lütfen aşağıdaki örneğe bakın.

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.