将一列字符串转换为Pandas中的整数列

时间:2015-12-17 08:11:01

标签: python pandas

我正在尝试将一列字符串转换为整数标识符......我无法在pandas(或python)中找到一种优雅的方法。在下面的例子中,我通过映射将“A”(字符串的列/变量)转换为数字,但它对我来说看起来像是一个肮脏的黑客

import pandas as pd                                                                             
import numpy as np

df = pd.DataFrame({'A': ['homer_simpson', 'mean_street', 'homer_simpson', 'bla_bla'], 'B': 4})

unique = df['A'].unique()
mapping = dict(zip(unique, np.arange(len(unique))))

new_df = df.replace({'A': mapping})

是否有更好,更直接的方法来实现这一目标?

4 个答案:

答案 0 :(得分:5)

如何使用factorize

>>> labels, uniques = df.A.factorize()
>>> df.A = labels
>>> df
   A  B
0  0  4
1  1  4
2  0  4
3  2  4

http://pandas.pydata.org/pandas-docs/version/0.17.1/generated/pandas.factorize.html

答案 1 :(得分:1)

转换字典上的简单地图应该可以满足您的需求。字典中的所有值都是唯一的,因此转置它不会导致重复键。

df['A'] = df.A.map({val: n for n, val in enumerate(df['A'].unique())})

>>> df
   A  B
0  0  4
1  1  4
2  0  4
3  2  4

答案 2 :(得分:0)

假设您并不关心整数是什么,只需要有一致的映射,您可以(1)使用分类代码或(2)排名值:

>>> df["A_categ"] = pd.Categorical(df.A).codes
>>> df["A_rank"] = df["A"].rank("dense").astype(int)
>>> df
               A  B  A_categ  A_rank
0  homer_simpson  4        1       2
1    mean_street  4        2       3
2  homer_simpson  4        1       2
3        bla_bla  4        0       1

答案 3 :(得分:0)

很抱歉,但我没有足够的声誉评论(这里有一个新人)。只是想知道使用Dataframe join是否会更快这样:

df.merge(df.drop_duplicates().reset_index(),on="A")["index"]