Chuyển đổi một cột trong khung dữ liệu gấu trúc từ int thành chuỗi


106

Tôi có một khung dữ liệu bằng gấu trúc với các cột dữ liệu int và str hỗn hợp. Tôi muốn nối các cột trước tiên trong khung dữ liệu. Để làm điều đó, tôi phải chuyển đổi một intcột thành str. Tôi đã cố gắng làm như sau:

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

hoặc là

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

nhưng trong cả hai trường hợp, nó không hoạt động và tôi gặp lỗi nói rằng "không thể nối các đối tượng 'str' và 'int'". Nối hai strcột đang hoạt động hoàn toàn tốt.


Câu trả lời:


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

Chuyển đổi một loạt

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'

Đừng quên gán lại kết quả:

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

Chuyển đổi toàn bộ khung hình

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
Tôi thực sự không hiểu tại sao, nhưng mtrx ['X.3']. Apply (str) cũng không hoạt động với tôi :( dtype vẫn hiển thị int64. Khung dữ liệu cho hàng 23177 và cột X.3 chỉ có số. Trong . [21]: mtrx [ 'X.3 cho chúng ta'] dtype Out [21]: dtype ( 'Int64')
Malfet

0.7.0, đi kèm với python 2.7 trên hệ thống Ubuntu
Malfet

phiên bản hiện tại là 0.12, bạn nên nâng cấp.
Jeff,

df ['A']. apply (str) không hoạt động. nhưng df.column_name = df.column_name.astype (str) hoạt động. Không biết tại sao.
Dmitry Konovalov

1
@DmitryKonovalov trong chuỗi python là bất biến, vì vậy bất cứ khi nào bạn thao tác dữ liệu, bạn phải đặt lại kết quả vào biến.
Sriram Arvind Lakshmanakumar

92

Thay đổi kiểu dữ liệu của cột DataFrame:

Tới int:

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

Tới str:

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


7
Điều này thật hấp dẫn, nhưng nó chậm hơn khoảng 4 lần so với apply(str)@Jeff, trong thử nghiệm của tôi bằng cách sử dụng pd.Series(np.arange(1000000)).
John Zwinck

2
Điều này làm việc cho tôi. df['A'] = df['A'].apply(str)cũng hoạt động. Câu trả lời do @Jeff cung cấp không phù hợp với tôi.
tommy.carstensen

1
Về nhận xét của @ JohnZwinck, việc sử dụng Python3 có vẻ giống như sử dụng nhanh gấp 2 lần apply()thay vì 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

Cảnh báo : Cả hai giải pháp được đưa ra ( astype () và apply () ) không bảo toàn giá trị NULL ở dạng nan hoặc dạng 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()

Tôi tin rằng điều này được khắc phục bằng cách triển khai to_string ()


1
to_string cho phép bạn chọn xử lý Nan, ví dụ: trả về chuỗi rỗng thay vì 'Nan'
seanv507

1
(Tôi không đồng ý, chỉ mở rộng những gì bạn đã nói) - đã muốn nói +1
seanv507


0

Chỉ để tham khảo thêm.

Tất cả các câu trả lời trên sẽ hoạt động trong trường hợp có khung dữ liệu. Nhưng nếu bạn đang sử dụng lambda trong khi tạo / sửa đổi một cột thì điều này sẽ không hoạt động, Vì ở đó nó được coi là thuộc tính int thay vì chuỗi gấu trúc. Bạn phải sử dụng str (target_attribute) để biến nó thành một chuỗi. Hãy tham khảo ví dụ dưới đây.

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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.