Я хочу установить dtype
s нескольких столбцов в pd.Dataframe
(у меня есть файл, который мне пришлось вручную проанализировать в список списков, так как файл не подлежал обработке pd.read_csv
)
import pandas as pd
print pd.DataFrame([['a','1'],['b','2']],
dtype={'x':'object','y':'int'},
columns=['x','y'])
я получил
ValueError: entry not a 2- or 3- tuple
Единственный способ их установить - это перебрать каждую переменную столбца и преобразовать ее с помощью astype
.
dtypes = {'x':'object','y':'int'}
mydata = pd.DataFrame([['a','1'],['b','2']],
columns=['x','y'])
for c in mydata.columns:
mydata[c] = mydata[c].astype(dtypes[c])
print mydata['y'].dtype #=> int64
Есть ли способ лучше?
df = pd.DataFrame([['a','1'],['b','2']], dtype='int', columns=['x','y'])
"работает" ... но: sОтветы:
Начиная с версии 0.17, вы должны использовать явные преобразования:
(Как упоминалось ниже, больше никакой "магии"
convert_objects
устарело в версии 0.17)Вы можете применить их к каждому столбцу, который хотите преобразовать:
и убедитесь, что dtype обновлен.
СТАРЫЙ / УСТАРЕВШИЙ ОТВЕТ для панд
convert_objects
0,12–0,16: вы можете использовать для определения лучших типов dtypes:Магия! (Печально видеть, что это устарело.)
источник
type.convert
немного нравится в R; приятно, но в некоторых случаях оставляет желать лучшего.convert_objects()
что он устарел ... я не уверен, что его заменило?Для тех, кто пришел из Google (и т. Д.), Таких как я:
convert_objects
устарел с версии 0.17 - если вы его используете, вы получите предупреждение вроде этого:Вы должны сделать что-то вроде следующего:
df =
df.astype(np.float)
df["A"] =
pd.to_numeric(df["A"])
источник
pd.to_datetime, to_timedelta, to_numeric
это должен быть принятый ответ.вы можете явно установить типы с помощью pandas
DataFrame.astype(dtype, copy=True, raise_on_error=True, **kwargs)
и передать словарь с типами dtypes, которые вы хотитеdtype
вот пример:
теперь вы можете видеть, что это изменилось
источник
Другой способ установить типы столбцов - сначала создать массив записей с желаемыми типами, заполнить его, а затем передать его конструктору DataFrame.
источник
столкнулся с аналогичной проблемой с вами. В моем случае у меня есть тысячи файлов из журналов cisco, которые мне нужно проанализировать вручную.
Чтобы быть гибким с полями и типами, я успешно протестировал с помощью StringIO + read_cvs, который действительно принимает dict для спецификации dtype.
Я обычно помещаю каждый из файлов (5-20 тысяч строк) в буфер и динамически создаю словари dtype.
В конце концов я объединяю (с категориальным ... благодаря 0.19) эти фреймы данных в большой фрейм данных, который выгружаю в hdf5.
Что-то в этом роде
Не очень питонический .... но выполняет свою работу
Надеюсь, поможет.
JC
источник
Лучше использовать типизированные np.arrays, а затем передавать данные и имена столбцов в качестве словаря.
источник