Pandas 데이터 프레임 내의 열을 정수에서 문자열로 변환


106

int 및 str 데이터 열이 혼합 된 팬더에 데이터 프레임이 있습니다. 데이터 프레임 내에서 먼저 열을 연결하고 싶습니다. 그렇게하려면 int열을 str. 다음과 같이 시도했습니다.

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

또는

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

하지만 두 경우 모두 작동하지 않고 " 'str'및 'int'개체를 연결할 수 없습니다."라는 오류가 발생합니다. 두 str열을 연결하면 완벽하게 작동합니다.


답변:


137
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

시리즈 변환

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'

결과를 다시 할당하는 것을 잊지 마십시오.

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

전체 프레임 변환

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
나는 정말로 왜 그런지 이해하지 못하지만 mtrx [ 'X.3']. apply (str) 나에게도 작동하지 않습니다 :( dtype은 여전히 ​​int64를 표시합니다. 23177 행과 X.3 열의 데이터 프레임에는 숫자 만 있습니다. [21] : mtrx [ 'X.3']. dtype Out [21] : dtype ( 'int64')
Malfet

0.7.0은 우분투 시스템에 파이썬 2.7와 함께
Malfet

현재 버전은 0.12이므로 업그레이드해야합니다.
Jeff

df [ 'A']. apply (str)이 작동하지 않습니다. 그러나 df.column_name = df.column_name.astype (str) 작동합니다. 이유를 모르겠습니다.
Dmitry Konovalov

1
파이썬 문자열의 @DmitryKonovalov는 변경이 불가능하므로 데이터를 조작 할 때마다 결과를 변수에 다시 넣어야합니다.
Sriram Arvind Lakshmanakumar

92

DataFrame 열의 데이터 유형 변경 :

int로 :

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

str하려면 :

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


7
이 호소하고 있지만,보다 느린 배에 관한 apply(str)내 테스트를 사용하여, @Jeff에서 pd.Series(np.arange(1000000)).
John Zwinck

2
이것은 나를 위해 작동합니다. df['A'] = df['A'].apply(str)또한 작동합니다. @Jeff가 제공 한 대답은 저에게 효과가 없습니다.
tommy.carstensen

1
@JohnZwinck의 의견과 관련하여 Python3을 사용하면 다음 apply()대신 사용하는 것이 2 배 빠른 것 같습니다 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 2010

15

경고 : 주어진 두 솔루션 ( astype () 및 apply () ) 은 nan 또는 None 형식에서 NULL 값을 유지하지 않습니다.

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

나는 이것이 to_string () 의 구현으로 고쳐 졌다고 생각합니다.


1
to_string을 사용하면 Nan 처리를 선택할 수 있습니다. 예를 들어 'Nan'대신 빈 문자열을 반환합니다.
seanv507

1
(나는 동의하지 않았으며, 당신이 말한 것을 확장했습니다.)-말하고 싶었습니다 +1
seanv507


0

추가 참조를 위해.

위의 모든 답변은 데이터 프레임의 경우 작동합니다. 그러나 열을 생성 / 수정하는 동안 람다를 사용하는 경우 pandas 시리즈 대신 int 속성으로 간주되기 때문에 작동하지 않습니다. str (target_attribute)을 사용하여 문자열로 만들어야합니다. 아래 예를 참조하십시오.

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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.