Перетворення стовпця в рамці даних панди з int в рядок


107

У мене є кадр даних у пандах із змішаними стовпцями даних int та str. Я хочу спочатку об'єднати стовпці в рамці даних. Для цього мені потрібно перетворити intстовпець у str. Я намагався зробити наступне:

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

або

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

але в обох випадках це не працює, і я отримую помилку, кажучи: "не можна об'єднати" str "та" int "об'єкти". Об’єднання двох strстовпців працює прекрасно.


Відповіді:


139
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, поставляються з python 2.7 в системі Ubuntu
Malfet

поточна версія 0,12, вам слід оновити.
Джефф

df ['A']. застосовувати (str) не працює. але df.column_name = df.column_name.astype (str) працює. Не знаю, чому.
Дмитро Коновалов

1
@DmitryKonovalov у рядках python незмінні, тому щоразу, коли ви маніпулюєте даними, вам доведеться повернути результат у змінну.
Шрірам Арвінд Лакшманакумамар

92

Змінення типу даних стовпця DataFrame:

Для введення:

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

До str:

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


7
Це привабливо, але apply(str)в моєму тесті це приблизно в 4 рази повільніше, ніж у @Jeff pd.Series(np.arange(1000000)).
Джон Цвінк

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 (range ( 1000)) '). Timeit (1000) >>> 0.41499893204309046 >>> timeit.Timer (' c.astype (str) ', setup =' імпортувати панди як pd; c = pd.Series (діапазон (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 дозволяє вибрати обробку Nan, наприклад, повернути порожню рядок, а не 'Nan'
seanv507

1
(Я не погоджувався, просто розширював те, що ви сказали) - хотів сказати +1
seanv507


0

Просто для додаткової довідки.

Усі вищезазначені відповіді працюватимуть у випадку з кадрами даних. Але якщо ви використовуєте лямбда під час створення / зміни стовпця, це не працюватиме, оскільки там він розглядається як атрибут int замість серії pandas. Ви повинні використовувати 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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.