3个Pandas高频使用函数
本文主要是介绍3个Pandas中很实用的函数:apply agg transform
模拟数据
In [1]:
代码语言:javascript复制import pandas as pd
import numpy as np
In [2]:
代码语言:javascript复制df = pd.DataFrame(
{"name":["xiaoming","sunjun","jimmy","tom"],
"sex":["male","female","female","male"],
"chinese":[100,80,90,92],
"math":[90,100,88,90]
})
df
Out[2]:
name | sex | chinese | math | |
---|---|---|---|---|
0 | xiaoming | male | 100 | 90 |
1 | sunjun | female | 80 | 100 |
2 | jimmy | female | 90 | 88 |
3 | tom | male | 92 | 90 |
函数apply
一个非常灵活的函数,能够对整个DataFrame或者Series执行给定函数的操作。
函数可以是自定义的,也可以是python或者pandas内置的函数
使用1:自带函数
改变字段类型:从int64变成float64
In [3]:
代码语言:javascript复制df.dtypes # 改变前
Out[3]:
代码语言:javascript复制name object
sex object
chinese int64
math int64
dtype: object
In [4]:
代码语言:javascript复制df["chinese"] = df["chinese"].apply(float)
In [5]:
代码语言:javascript复制df.dtypes # 改变后
Out[5]:
代码语言:javascript复制name object
sex object
chinese float64
math int64
dtype: object
使用2:自定义函数
In [6]:
代码语言:javascript复制def change_sex(x): # male-0 female-1
return 0 if x == "male" else 1
In [7]:
代码语言:javascript复制df["sex"] = df["sex"].apply(change_sex)
df # 改变后
使用3:匿名函数lambda
In [8]:
代码语言:javascript复制# float--->int
df["chinese"] = df["chinese"].apply(lambda x: int(x))
df.dtypes
Out[8]:
代码语言:javascript复制name object
sex int64
chinese int64
math int64
dtype: object
In [9]:
代码语言:javascript复制# 将name变成首字母大写
df["name"] = df["name"].apply(lambda x: x.title())
df
代码语言:javascript复制# 同时操作两列,记得axis=1
df["score"] = df.apply(lambda x: x["chinese"] x["math"], axis=1)
df
函数agg
操作Series数据
In [11]:
代码语言:javascript复制# 1
df["chinese"].agg(["mean", "sum"])
Out[11]:
代码语言:javascript复制mean 90.5
sum 362.0
Name: chinese, dtype: float64
操作DataFrame数据
In [12]:
代码语言:javascript复制# 2
df[["chinese","math"]].agg({"chinese":["sum"], "math":["mean"]})
Out[12]:
chinese | math | |
---|---|---|
sum | 362.0 | NaN |
mean | NaN | 92.0 |
In [13]:
代码语言:javascript复制# 3
df[["chinese","math"]].agg({"chinese":["sum","mean"], "math":["mean"]})
Out[13]:
chinese | math | |
---|---|---|
sum | 362.0 | NaN |
mean | 90.5 | 92.0 |
groupby agg的联合使用:
In [14]:
代码语言:javascript复制# 4
df.groupby("sex").agg(["mean","sum"])
代码语言:javascript复制# 5
df.groupby("sex").agg({"chinese":["mean"], "math":["sum","min","max"]})
还可以自定义新生成的字段名称:
代码语言:javascript复制df.groupby("sex").agg(chinese_mean=("chinese","mean"), math_min=("chinese","min"))
函数transform
现在的df是这样子:
假设有一个需求:统计性别男女 sex 的chinese 的平均分(新增一个字段放在最后面),如何实现?
办法1:使用groupby merge
In [18]:
代码语言:javascript复制# 1、先groupby
df1 = df.groupby("sex")["chinese"].mean().reset_index()
df1.columns = ["sex", "average"]
df1
代码语言:javascript复制# 2、merge
# 结果
df = pd.merge(df, df1, on="sex")
df
方法2:groupby map
In [20]:
代码语言:javascript复制dic = df.groupby("sex")["chinese"].mean().to_dict()
dic
Out[20]:
代码语言:javascript复制{0: 96.0, 1: 85.0}
In [21]:
代码语言:javascript复制df["average_map"] = df["sex"].map(dic)
df
使用transform
可以一步到位
代码语言:javascript复制df["average_tran"] = df.groupby("sex")["chinese"].transform("mean")
df
你学会了吗?