如何在熊猫中导入数字编码的列?

时间:2016-04-29 11:07:48

标签: python pandas

我正在导入一个以数字方式编码多个变量的数据集,例如:

SEX
1 - Male
2 - Female

我最好猜测如何转换这些(因此它们在我的数据框中显示为MaleFemale而不是数字)是这样的:

df.SEX.replace({1: 'Male', 2: 'Female'}, inplace=True)

是否有更好/更标准的方法来执行此操作(理想情况下,作为我对pd.read_fwf的调用的一部分或作为许多列的单个函数) - 它是一个相当大的文件,我有很多列到以这种方式重新编码。

1 个答案:

答案 0 :(得分:2)

您可以使用categories

df = pd.DataFrame({"Sex": [1, 2, 1, 1, 2, 1, 2]})

更改dtype:

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