我有一个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
实际上,我拥有的数据要大得多,x
和y axis
是热图的标签。由于这些标签通常非常大,我想枚举它们并用索引替换它们(跨x
和y 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
有人可以给我一些关于如何以编程方式执行此操作的建议吗?
答案 0 :(得分:1)
由于您要转换多列中的值,因此您需要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')