Pandas根据列中的值将字符串映射为整数

9

我有一个包含两列的数据框:

state  total_sales
AL      16714
AR      6498
AZ      107296
CA      33717

现在我想将状态列中的字符串映射为从1到N(其中N是行数,这里是4),基于total_sales值的增序。结果应存储在另一列中(称为标签)。也就是说,要得到如下所示的结果:
state  total_sales label
AL      16714         3
AR      6498          4
AZ      107296        1
CA      33717         2

请提供一个向量化实现的建议。

1
请展示一些你的努力。 - ZdaR
@ZdaR:用for循环实现了它,但是读到说不建议在数据框中使用循环。 - Vijay P R
2个回答

9
你可以使用 rank 函数并转换为整数类型:int
df['label'] = df['total_sales'].rank(method='dense', ascending=False).astype(int)
print (df)
  state  total_sales  label
0    AL        16714      3
1    AR         6498      4
2    AZ       107296      1
3    CA        33717      2

2

将一列值转换为整数的一个选项是使用 pandas.Categorical

实际上,它将相同的值分组在一起,对于所有值都唯一的情况,每个“组”只有一个值。生成的对象具有codes属性,这是一个Numpy整数数组,指示每个输入值所在的组。

应用于此问题,如果您有:

In [12]: data = pd.DataFrame({
             'state': ['AL', 'AR', 'AZ', 'CA'],
             'total_sales': [16714, 6498, 107296, 33717]
         })

您可以按照以下方式添加标签列:

使用

In [13]: data['label'] = len(data) - pd.Categorical(data.total_sales, ordered=True).codes
In [14]: print(data)

  state  total_sales  label
0    AL        16714      3
1    AR         6498      4
2    AZ       107296      1
3    CA        33717      2

对于这个示例,它并不像jezrael的答案那样快,但它具有广泛的应用,并且在我将一系列较大的数据编码为整数时更快。需要注意的是,如果total_sales列中有两个相同的值,它们将被分配相同的标签。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接