我有一个 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 轴
是热图的标签。因为这些标签通常非常大,所以我想枚举它们并用索引替换它们(跨越 x
和 y 轴
,即如果 cheese
在 x
中是 1
它在 y 轴
中也是 1
)。我还需要能够编写将新索引映射到其原始值的图例。
所需的输出可能如下所示:
x_axis y_axis data
0 1 2 4
1 3 1 3
那么图例就是:
cheese=1
farms=2
wales=3
任何人都可以给我一些关于如何以编程方式执行此操作的建议吗?
最佳答案
因为要转换多列的值,所以需要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, 'farms' = 1, 'wales' = 2) :
>>> s.cat.categories
Index(['Cheese', 'farms', 'wales'], dtype='object')
关于python - 用整数替换 pandas DataFrame 的字符串元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36600354/