映射列值是指将一个列中的某些特定值映射为另外一些值,常用于数据清洗和转换。
使用映射列值的场景有很多,以下是几种常见的场景:
本篇介绍几个常用的映射小技巧。
map
映射是最简单也是最直接的,比如下面的示例,将性别映射成0
和1
。
import pandas as pd
df = pd.DataFrame({
"name": ["Lily", "Harry",
"Annie", "Joe","Tom"],
"sex": ["female", "male",
"female", "male","male"],
"grade":["A", "E", "B", "F", "A"],
})
df.sex = df.sex.map({
"female": 0,
"male": 1,
})
df
用map
函数映射列的值是最直观的方式,不过如果列的值种类比较多的时候,一个一个映射比较麻烦。
比如下面示例中的 grade
列,不像 sex
列只有两种值。
这时,可以用 factorize 方法来映射。
df = pd.DataFrame({
"name": ["Lily", "Harry",
"Annie", "Joe","Tom"],
"sex": ["female", "male",
"female", "male","male"],
"grade":["A", "E", "B", "F", "A"],
})
df.sex = df.sex.factorize()[0]
df.grade = df.grade.factorize()[0]
df
factorize函数返回的是一个二元元组,第一个元素是映射之后的数字数组,
第二个元素是索引类型,索引的值就是列中各个不同的值。
df.grade.factorize()
所以代码中用的是 factorize()[0]
。
这里还有一个小技巧,如果映射后想把得到的值二元化,
比如上面的 grade
列,映射之后有4
种不同的值,代表不同的成绩等级。
如果我们只想要不及格(F
)和及格(非F
)两种情况,那么
df.grade = df.grade.factorize()[0]
df.grade = (df.grade == 3).astype("int")
df