我有一个包含两列的数据框:
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
请建议矢量化实施。
答案 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