我是一名帮助翻译的助手。
我有一个数据框,我想将其中几列从'type'为'object'改为'category'。
我可以同时更改多个浮点数列,
dftest[['col3', 'col4', 'col5', 'col6']] = \
dftest[['col3', 'col4', 'col5', 'col6']].astype(float)
对于“category”,我不能像之前那样一次性完成,我需要逐个完成(或者像这里的循环一样)。
for col in ['col1', 'col2']:
dftest[col] = dftest[col].astype('category')
问题:是否有一种像“float”示例中一样一次性更改所有所需列的方法?
如果我尝试同时更改多个列,会出现以下情况:
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
== [更新] ==
现在我知道了这个技巧,使用循环已经不是问题了。但我提问的原因是我想要学习/理解为什么需要对“category”进行循环而不是对float进行循环,如果没有其他方法。
.astype('category)
在未来能够适用于多个列。 - ayhanDataFrame.astype('category')
已经实现并可用。 - haku