การแปลงคอลัมน์ภายในดาต้าเฟรมแพนด้าจาก int เป็นสตริง


108

ฉันมีดาต้าเฟรมในแพนด้าที่มีคอลัมน์ข้อมูล int และ str ผสมกัน ฉันต้องการต่อคอลัมน์ภายในดาต้าเฟรมก่อน ในการทำเช่นนั้นฉันต้องแปลงintคอลัมน์เป็นstr. ฉันได้พยายามทำดังนี้:

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

หรือ

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

แต่ในทั้งสองกรณีมันใช้งานไม่ได้และฉันได้รับข้อผิดพลาดว่า "ไม่สามารถเชื่อมต่อวัตถุ 'str' และ 'int' ได้ การเชื่อมสองstrคอลัมน์เข้าด้วยกันทำงานได้ดีอย่างสมบูรณ์


คำตอบ:


141
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'] ใช้ (str) ไม่ทำงานสำหรับฉันเช่นกัน :( dtype ยังคงแสดง int64 ดาต้าเฟรมสำหรับ 23177 แถวและคอลัมน์ X.3 มีเฉพาะตัวเลขใน [21]: mtrx ['X.3']. dtype Out [21]: dtype ('int64')
Malfet

0.7.0 มาพร้อมกับ python 2.7 บนระบบ Ubuntu
Malfet

เวอร์ชันปัจจุบันคือ 0.12 คุณควรอัปเกรด
เจฟฟ์

df ['A'] ใช้ (str) ไม่ทำงาน แต่ df.column_name = df.column_name.astype (str) ใช้งานได้ ไม่รู้ว่าทำไม
Dmitry Konovalov

1
@DmitryKonovalov ในสตริง python ไม่เปลี่ยนรูปดังนั้นเมื่อใดก็ตามที่คุณจัดการกับข้อมูลคุณต้องใส่ผลลัพธ์กลับเข้าไปในตัวแปร
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 ประมาณ 4 เท่าในการทดสอบของฉันโดยใช้pd.Series(np.arange(1000000))ไฟล์.
John Zwinck

2
สิ่งนี้ใช้ได้กับฉัน df['A'] = df['A'].apply(str)ยังใช้งานได้ คำตอบของ @Jeff ไม่ได้ผลสำหรับฉัน
tommy.carstensen

1
เกี่ยวกับความคิดเห็นของ @JohnZwinck การใช้ Python3 ดูเหมือนว่าจะใช้งานได้เร็วกว่า 2x apply()แทนastype(): timeit.Timer ('c.apply (str)', setup = 'นำเข้าแพนด้าเป็น pd; c = pd.Series (ช่วง ( 1000)) ') timeit (1000) >>> 0.41499893204309046 >>> timeit.Timer (' c.astype (str) ', setup =' นำเข้าแพนด้าเป็น pd; c = pd ชุด (ช่วง (1000)) ' ) .timeit (1000) 0.8004439630312845
hamx0r

15

คำเตือน : โซลูชันทั้งสองที่กำหนด( astype () และใช้ () )ไม่เก็บค่า NULL ไว้ใน nan หรือ 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()

ฉันเชื่อว่าสิ่งนี้ได้รับการแก้ไขโดยการใช้to_string ()


1
to_string ช่วยให้คุณสามารถเลือกการจัดการน่านเช่นเพื่อส่งคืนสตริงว่างแทนที่จะเป็น 'น่าน'
seanv507

1
(ฉันไม่ได้ไม่เห็นด้วยแค่ขยายความในสิ่งที่คุณพูด) - อยากจะพูด +1
seanv507


0

เพียงเพื่อการอ้างอิงเพิ่มเติม

คำตอบทั้งหมดข้างต้นจะใช้ได้ในกรณีของกรอบข้อมูล แต่ถ้าคุณใช้แลมด้าในขณะที่สร้าง / แก้ไขคอลัมน์สิ่งนี้จะไม่ได้ผลเนื่องจากมีการพิจารณาว่าเป็นแอตทริบิวต์ 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.