您可以为此使用categories:
df = pd.DataFrame({"Sex": [1, 2, 1, 1, 2, 1, 2]})
更改数据类型:
df["Sex"] = df["Sex"].astype("category")
print(df["Sex"])
Out[33]:
0 1
1 2
2 1
3 1
4 2
5 1
6 2
Name: Sex, dtype: category
Categories (2, int64): [1, 2]
重命名类别:
df["Sex"] = df["Sex"].cat.rename_categories(["Male", "Female"])
print(df)
Out[36]:
Sex
0 Male
1 Female
2 Male
3 Male
4 Female
5 Male
6 Female
我在大约 75k 的数据集上进行了尝试(从 beer reviews dataset 中选择评价最多的 30 种啤酒)
rep_dict = dict(zip(df.beer_name.unique(), range(len(df.beer_name.unique())))) #it constructs a dictionary where the beer names are assigned a number from 0 to 29.
replace 很慢:
%timeit df["beer_name"].replace(rep_dict)
10 loops, best of 3: 139 ms per loop
map 比预期更快(因为它会寻找完全匹配的):
%timeit df["beer_name"].map(rep_dict)
100 loops, best of 3: 2.78 ms per loop
更改列的类别几乎与map一样多:
%timeit df["beer_name"].astype("category")
100 loops, best of 3: 2.57 ms per loop
但是,更改后,类别重命名会更快:
df["beer_name"] = df["beer_name"].astype("category")
%timeit df["beer_name"].cat.rename_categories(range(30))
10000 loops, best of 3: 149 µs per loop
因此,第二个 map 将花费与第一个 map 一样多的时间,但是一旦您更改类别,rename_categories 会更快。 很遗憾,category dtype 在读取文件时无法分配。之后需要更改类型。
从 0.19.0 版开始,您可以将 dtype='category' 传递给 read_csv(或使用字典指定要解析为类别的列)。 (docs)