Pandas 数据处理常用函数
模拟数据集:
boolean=[True,False]
gender=["男","女"]
color=["white","black","yellow"]
data=pd.DataFrame({
"height":np.random.randint(150,190,10),
"weight":np.random.randint(40,90,10),
"smoker":[boolean[x] for x in np.random.randint(0,2,10)],
"gender":[gender[x] for x in np.random.randint(0,2,10)],
"age":np.random.randint(15,90,10),
"color":[color[x] for x in np.random.randint(0,len(color),10) ]
}
)
1. map
将gender列中的男替换为1,女替换为0,使用Series.map()可以很容易做到。
#①使用字典进行映射
data["gender"] = data["gender"].map({"男":1, "女":0})
#②使用函数
def gender_map(x):
gender = 1 if x == "男" else 0
return gender
#注意这里传入的是函数名,不带括号
data["gender"] = data["gender"].map(gender_map)
不论是利用字典还是函数进行映射,map方法都是把对应的数据逐个当作参数传入到字典或函数中,得到映射后的值。
2. apply
(1). 同时Series对象还有apply方法,apply方法的作用原理和map方法类似,区别在于apply能够传入功能更为复杂的函数。
def apply_age(x,bias):
return x+bias
#以元组的方式传入额外的参数
data["age"] = data["age"].apply(apply_age,args=(-3,))
(2). 对DataFrame而言,apply是非常重要的数据处理方法。DataFrame中axis=0代表操作对列columns进行,axis=1代表操作对行row进行。
# 沿着0轴求和
data[["height","weight","age"]].apply(sum, axis=0)
# 沿着1轴求BMI指数
def BMI(series):
weight = series["weight"]
height = series["height"]/100
BMI = weight/height**2
return BMI
data["BMI"] = data.apply(BMI,axis=1)
- 无论
axis=0还是axis=1,其传入指定函数的默认形式均为Series。
3. applymap
applymap的用法比较简单,会对DataFrame中的每个单元格执行指定函数的操作。
4. groupby
group = data.groupby("gender")
groupby的过程就是将原有的DataFrame按照groupby的字段,划分为若干个分组DataFrame,被分为多少个组就有多少个分组DataFrame。所以说,在groupby之后的一系列操作(如agg,transform,apply等),均是基于子DataFrame的操作。
(1). agg
聚合操作是groupby后非常常见的操作,常见的聚合操作有:
- min
- max
- sum
- meam
- median
- std
- var
- count
比如要计算男女员工的平均年龄以及体重的中位数,可以利用字典进行聚合操作的指定:
data.groupby('gender').agg({'weight':'median','age':'mean'})
(2). transform
如果现在需要在原数据集中新增一列avg_age,代表男女员工的平均年龄(相同性别的员工具有一样的平均年龄):
data['avg_age'] = data.groupby('gender')['age'].transform('mean')
(3). apply
对于groupby后的apply,以分组后的子DataFrame作为参数传入指定函数的,基本操作单位是DataFrame,而之前介绍的apply的基本操作单位是Series。
获取男女员工中年龄最大的员工的数据:
data.groupby('gender',as_index=False).apply(lambda x : x.sort_values(by='age', ascending=False).iloc[0,:])
获取男女员工中排名前二的年龄:
data['age'].groupby(data['gender']).apply(lambda x : x.sort_values(ascending=False)[:2]).reset_index()