Pandas根据列中的值将字符串映射到int

时间:2017-02-19 17:46:11

标签: python pandas dataframe

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

state  total_sales
AL      16714
AR      6498
AZ      107296
CA      33717

现在我想根据total_sales中值的递增顺序将state列中的字符串映射到int,从1到N(其中N是行数,这里是4)。结果应存储在另一列(比如标签)中。也就是说,想要一个像这样的结果:

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

请建议矢量化实施。

3 个答案:

答案 0 :(得分:4)

您可以将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

答案 1 :(得分:1)

将一列值转换为整数的一种方法是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's answer,但是它具有广泛的应用范围,并且在我将整数编码为更大的序列时,速度更快。请注意,如果total_sales列中有两个相同的值,则会为它们分配相同的标签。

答案 2 :(得分:0)

在处理Fitbit睡眠阶段遇到相同问题之后,我制定了另一种解决方案(可以控制到整数的映射)。在这里,我使用Pandas表示分类变量的方式。以下是显示MWE解决方案的简单示例。

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

然后,我们只是要求将“状态”列作为类别变量:

df['label'] = df.state.astype("category").cat.codes
print(df)
  state  total_sales  label
0    AL        16714      0
1    AR         6498      1
2    AZ       107296      2
3    CA        33717      3

如果您需要控制顺序(例如,如果订购顺序与显示方式不同),则可以提供允许的类别列表,并以什么顺序显示:

df_cats = ['CA','AZ' ,'AL','AR']
df['label'] = df.state.astype("category",  categories=df_cats).cat.codes
print(df)
  state  total_sales  label
0    AL        16714      2
1    AR         6498      3
2    AZ       107296      1
3    CA        33717      0

任何不在类别列表中的标签都将产生“ -1”。您还可以使用一个关键字ordered=True,但我认为这并不重要。 有关Pandas类别数据dtype的更多信息,请参见:https://pandas.pydata.org/pandas-docs/stable/categorical.html