【发布时间】:2016-08-29 14:54:32
【问题描述】:
我有一个 DataFrame,我想在其中将几列从“对象”类型更改为“类别”。
float可以同时改变几列,
dftest[['col3', 'col4', 'col5', 'col6']] = \
dftest[['col3', 'col4', 'col5', 'col6']].astype(float)
对于“类别”我不能这样做,我需要一个一个地做(或者像here这样的循环)。
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
== [更新] ==
既然我知道了诀窍,我在使用循环时没有问题,但我问这个问题是因为我想了解/理解为什么我需要为“类别”而不是浮点数做一个循环,如果有的话没有其他办法。
【问题讨论】:
-
出于好奇,这有什么意义?速度?
-
@IanS 查看我的更新
-
“未实现”通常意味着它计划用于未来的版本。分类相对较新,因此我们预计
.astype('category)将来可以用于超过 1 列。
标签: python pandas numpy dataframe categorization