我正在尝试将一列字符串转换为整数标识符......我无法在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})
是否有更好,更直接的方法来实现这一目标?
答案 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"]