Преобразование столбца в кадре данных pandas из int в строку


109

У меня есть фреймворк в пандах со смешанными столбцами данных int и str. Я хочу сначала объединить столбцы в кадре данных. Для этого мне нужно преобразовать intстолбец в формат str. Я пытался сделать следующее:

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

или

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

но в обоих случаях это не работает, и я получаю сообщение об ошибке «не удается объединить объекты 'str' и 'int'». Объединение двух strстолбцов работает отлично.


Ответы:


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

Преобразовать серию

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')
Малфет

0.7.0, поставляется с python 2.7 в системе Ubuntu
Малфет,

текущая версия - 0.12, вам следует обновить ее.
Джефф

df ['A']. apply (str) не работает. но df.column_name = df.column_name.astype (str) работает. Понятия не имею почему.
Дмитрий Коновалов

1
@DmitryKonovalov в строках Python неизменяем, поэтому всякий раз, когда вы манипулируете данными, вы должны вернуть результат в переменную.
Шрирам Арвинд Лакшманакумар

92

Измените тип данных столбца DataFrame:

К int:

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

По ул:

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


7
Это привлекательно, но apply(str)в моем тесте с использованием он примерно в 4 раза медленнее, чем от @Jeff pd.Series(np.arange(1000000)).
Джон Цвинк 01

2
У меня это работает. df['A'] = df['A'].apply(str)тоже работает. Ответ @Jeff мне не подходит.
tommy.carstensen

1
Что касается комментария @ JohnZwinck, использование Python3 похоже на использование в 2 раза быстрее apply()вместо 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 =' импортировать панды как pd; c = pd.Series (range (1000)) ' ) .timeit (1000) 0.8004439630312845
hamx0r

15

Предупреждение : оба указанных решения ( astype () и apply () ) не сохраняют значения 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.