У меня есть DataFrame, в котором я хочу изменить несколько столбцов с типа «объект» на «категорию».
Я могу изменить несколько столбцов одновременно для float,
dftest[['col3', 'col4', 'col5', 'col6']] = \
dftest[['col3', 'col4', 'col5', 'col6']].astype(float)
Для «категории» я не могу сделать то же самое, мне нужно делать это по одному (или в цикле, например здесь ).
for col in ['col1', 'col2']:
dftest[col] = dftest[col].astype('category')
Вопрос: Есть ли способ внести изменения сразу во все нужные столбцы, как в примере с плавающей запятой?
Если я попытаюсь сделать несколько столбцов одновременно, у меня будет:
dftest[['col1','col2']] = dftest[['col1','col2']].astype('category')
## NotImplementedError: > 1 ndim Categorical are not supported at this time
Мой текущий рабочий тестовый код:
import numpy as np
import pandas as pd
factors= np.array([
['a', 'xx'],
['a', 'xx'],
['ab', 'xx'],
['ab', 'xx'],
['ab', 'yy'],
['cc', 'yy'],
['cc', 'zz'],
['d', 'zz'],
['d', 'zz'],
['g', 'zz']
])
values = np.random.randn(10,4).round(2)
dftest = pd.DataFrame(np.hstack([factors,values]),
columns = ['col1', 'col2', 'col3', 'col4', 'col5', 'col6'])
#dftest[['col1','col2']] = dftest[['col1','col2']].astype('category')
## NotImplementedError: > 1 ndim Categorical are not supported at this time
## it works with individual astype
#dftest['col2'] = dftest['col2'].astype('category')
#dftest['col1'] = dftest['col1'].astype('category')
print(dftest)
## doing a loop
for col in ['col1', 'col2']:
dftest[col] = dftest[col].astype('category')
dftest[['col3', 'col4', 'col5', 'col6']] = \
dftest[['col3', 'col4', 'col5', 'col6']].astype(float)
dftest.dtypes
выход:
col1 category
col2 category
col3 float64
col4 float64
col5 float64
col6 float64
dtype: object
== [обновление] ==
У меня нет проблем с использованием цикла теперь, когда я знаю трюк, но я задал вопрос, потому что хотел узнать/понять, ПОЧЕМУ мне нужно сделать цикл для «категории», а не для числа с плавающей запятой, если нет другого способ сделать это.
.astype('category)
будет работать для более чем 1 столбца в будущем. - person ayhan   schedule 31.08.2016