我有一个包含这种类型数据的数据框(列太多):
col1 int64 col2 int64 col3 category col4 category col5 category
列似乎是这样的:
Name: col3, dtype: category Categories (8, object): [B, C, E, G, H, N, S, W]
我想将列中的所有值转换为整数,如下所示:
[1, 2, 3, 4, 5, 6, 7, 8]
我通过这个解决了一个问题:
dataframe['c'] = pandas.Categorical.from_array(dataframe.col3).codes
现在我的数据框中有两列 - 旧的'col3'和新的'c',需要删除旧列.
这是不好的做法.这是工作,但在我的数据框架中有很多列,我不想手动完成.
这个pythonic怎么这么巧妙?
首先,要将Categorical列转换为其数字代码,您可以使用以下方法更轻松地执行此操作:dataframe['c'].cat.codes
.
此外,可以使用在数据帧中自动选择具有特定dtype的所有列select_dtypes
.这样,您可以对多个自动选择的列应用上述操作.
首先制作一个示例数据帧:
In [75]: df = pd.DataFrame({'col1':[1,2,3,4,5], 'col2':list('abcab'), 'col3':list('ababb')}) In [76]: df['col2'] = df['col2'].astype('category') In [77]: df['col3'] = df['col3'].astype('category') In [78]: df.dtypes Out[78]: col1 int64 col2 category col3 category dtype: object
然后通过使用select_dtypes
选择列,然后应用.cat.codes
每个列,您可以得到以下结果:
In [80]: cat_columns = df.select_dtypes(['category']).columns In [81]: cat_columns Out[81]: Index([u'col2', u'col3'], dtype='object') In [83]: df[cat_columns] = df[cat_columns].apply(lambda x: x.cat.codes) In [84]: df Out[84]: col1 col2 col3 0 1 0 0 1 2 1 1 2 3 2 0 3 4 0 1 4 5 1 1
这对我有用:
pandas.factorize( ['B', 'C', 'D', 'B'] )[0]
输出:
[0, 1, 2, 0]
如果你只关心你制作一个额外的列并在以后删除它,那么只需在第一个地方使用一个新列.
dataframe = pd.DataFrame({'col1':[1,2,3,4,5], 'col2':list('abcab'), 'col3':list('ababb')}) dataframe.col3 = pd.Categorical.from_array(dataframe.col3).codes
你完成了.现在Categorical.from_array
已弃用,请Categorical
直接使用
dataframe.col3 = pd.Categorical(dataframe.col3).codes
如果您还需要从索引到标签的映射,那么还有更好的方法
dataframe.col3, mapping_index = pd.Series(dataframe.col3).factorize()
检查下面
print(dataframe) print(mapping_index.get_loc("c"))
这里需要转换多列。因此,我使用的一种方法是..
for col_name in df.columns: if(df[col_name].dtype == 'object'): df[col_name]= df[col_name].astype('category') df[col_name] = df[col_name].cat.codes
这会将所有字符串/对象类型列转换为类别。然后将代码应用于每种类别。