Fork me on GitHub

3个高频使用Pandas函数

3个Pandas高频使用函数

本文主要是介绍3个Pandas中很实用的函数:apply + agg + transform

模拟数据

In [1]:

1
2
import pandas as pd
import numpy as np

In [2]:

1
2
3
4
5
6
7
8
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]:

1
df.dtypes  # 改变前

Out[3]:

1
2
3
4
5
name       object
sex object
chinese int64
math int64
dtype: object

In [4]:

1
df["chinese"] = df["chinese"].apply(float)

In [5]:

1
df.dtypes  # 改变后

Out[5]:

1
2
3
4
5
name        object
sex object
chinese float64
math int64
dtype: object

使用2:自定义函数

In [6]:

1
2
def change_sex(x):  # male-0  female-1
return 0 if x == "male" else 1

In [7]:

1
2
3
df["sex"] = df["sex"].apply(change_sex)

df # 改变后

使用3:匿名函数lambda

In [8]:

1
2
3
4
5
# float--->int

df["chinese"] = df["chinese"].apply(lambda x: int(x))

df.dtypes

Out[8]:

1
2
3
4
5
name       object
sex int64
chinese int64
math int64
dtype: object

In [9]:

1
2
3
4
5
# 将name变成首字母大写

df["name"] = df["name"].apply(lambda x: x.title())

df

1
2
3
4
# 同时操作两列,记得axis=1

df["score"] = df.apply(lambda x: x["chinese"] + x["math"], axis=1)
df

函数agg

操作Series数据

In [11]:

1
2
3
# 1

df["chinese"].agg(["mean", "sum"])

Out[11]:

1
2
3
mean     90.5
sum 362.0
Name: chinese, dtype: float64

操作DataFrame数据

In [12]:

1
2
3
# 2

df[["chinese","math"]].agg({"chinese":["sum"], "math":["mean"]})

Out[12]:

chinese math
sum 362.0 NaN
mean NaN 92.0

In [13]:

1
2
3
# 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]:

1
2
3
# 4

df.groupby("sex").agg(["mean","sum"])

1
2
# 5
df.groupby("sex").agg({"chinese":["mean"], "math":["sum","min","max"]})

还可以自定义新生成的字段名称:

1
df.groupby("sex").agg(chinese_mean=("chinese","mean"), math_min=("chinese","min"))

函数transform

现在的df是这样子:

假设有一个需求:统计性别男女 sex 的chinese 的平均分(新增一个字段放在最后面),如何实现?

办法1:使用groupby + merge

In [18]:

1
2
3
4
5
# 1、先groupby

df1 = df.groupby("sex")["chinese"].mean().reset_index()
df1.columns = ["sex", "average"]
df1

1
2
3
4
5
# 2、merge

# 结果
df = pd.merge(df, df1, on="sex")
df

方法2:groupby + map

In [20]:

1
2
dic = df.groupby("sex")["chinese"].mean().to_dict()
dic

Out[20]:

1
{0: 96.0, 1: 85.0}

In [21]:

1
2
df["average_map"] = df["sex"].map(dic)
df

使用transform

可以一步到位

1
2
df["average_tran"] = df.groupby("sex")["chinese"].transform("mean")
df

你学会了吗?

本文标题:3个高频使用Pandas函数

发布时间:2022年08月04日 - 00:08

原始链接:http://www.renpeter.cn/2022/08/04/3%E4%B8%AA%E9%AB%98%E9%A2%91%E4%BD%BF%E7%94%A8Pandas%E5%87%BD%E6%95%B0.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Coffee or Tea