Pandas 数据处理常用函数

289 阅读2分钟

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是非常重要的数据处理方法。DataFrameaxis=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()