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

Posted

技术标签:

【中文标题】用整数替换 pandas DataFrame 的字符串元素【英文标题】:Replacing string elements of a pandas DataFrame with integers 【发布时间】:2016-08-04 15:56:53 【问题描述】:

我有一个熊猫数据框:

   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 即如果cheese1x 它也是1 在@ 987654331@)。我还需要能够编写一个将新索引映射到其原始值的图例。

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

  x_axis y_axis  data
0      1      2     4
1      3      1     3

那么传说是:

cheese=1
farms=2
wales=3

谁能给我一些关于如何以编程方式执行此操作的建议?

【问题讨论】:

您的映射可能不完全清楚。如果有重复行,例如附加行 row3=['Bread','wales',3],会发生什么? 嗨 tfv,所以“面包”总是 4(例如)而 wales 总是 5 - 无论列如何 【参考方案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, 'farms' = 1, 'wales' = 2):

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

【讨论】:

以上是关于用整数替换 pandas DataFrame 的字符串元素的主要内容,如果未能解决你的问题,请参考以下文章

pandas.DataFrame.replace 用通配符

用字典值替换 Pandas Dataframe 中的部分字符串

用 Pandas DataFrame 中出现频率最高的单词替换单元格

Python Pandas Dataframe 用同一会话的另一个单元格的值替换单元格值

用 True/False 替换 pandas 数据框所有列的整数

pandas使用replace函数替换dataframe中的值:replace函数使用正则表达式对dataframe中的值进行替换