用整数替换pandas DataFrame的字符串元素

时间:2016-04-13 13:44:32

标签: python string pandas dataframe indexing

我有一个pandas数据帧:

   x_axis  y_axis  data
0  Cheese   farms     4
1   wales  Cheese     3

可以使用以下代码生成:

import pandas
cols=['x_axis','y_axis','data']
row1=['Cheese','farms',4]
row2=['wales','Cheese',3]
data=pandas.DataFrame([row1,row2],columns=cols)
print data

实际上,我拥有的数据要大得多,xy axis是热图的标签。由于这些标签通常非常大,我想枚举它们并用索引替换它们(跨xy axes,即如果cheese 1 x它在1中也是y axis。我还需要能够编写一个将新索引映射到其原始值的图例。

所需的输出可能如下所示:

  x_axis y_axis  data
0      1      2     4
1      3      1     3

然后传说将是:

cheese=1
farms=2
wales=3

有人可以给我一些关于如何以编程方式执行此操作的建议吗?

1 个答案:

答案 0 :(得分:1)

您需要categorical variables

由于您要转换多列中的值,因此您需要stack()成一个系列,然后调用astype

>>> s = df.loc[:, ['x_axis', 'y_axis']].stack().astype('category')
>>> s
0  x_axis    Cheese
   y_axis     farms
1  x_axis     wales
   y_axis    Cheese
dtype: category
Categories (3, object): [Cheese, farms, wales]

s现在是一个具有分类类型的系列:每个唯一字符串都映射到一个整数。

如果使用.cat访问者,则可以获取每个分类变量的整数代码。使用unstack()会返回一个DataFrame:

>>> s.cat.codes.unstack()
   x_axis  y_axis
0       0       1
1       2       0

这意味着您可以使用以下内容将这些整数列分配回原始列:

>>> df.loc[:, ['x_axis', 'y_axis']] = s.cat.codes.unstack()
>>> df
   x_axis  y_axis  data
0       0       1     4
1       2       0     3

字符串到整数的映射由s.cat.categories以索引的形式给出(所以' Cheese' = 0,' farm' = 1,&#39 ;威尔士' = 2):

>>> s.cat.categories
Index(['Cheese', 'farms', 'wales'], dtype='object')