3个Pandas高频使用函数

公众号:尤而小屋
作者:Peter
编辑:Peter

本文主要是给大家介绍3个Pandas日常高频使用函数:apply + agg + transform。

1c31b0d274d9663a224f982ffcd054b6.jpeg

模拟数据

模拟了一份简单的数据

In [1]:

import pandas as pd
import numpy as np

In [2]:

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]:

df.dtypes  # 改变前

Out[3]:

name       object
sex        object
chinese     int64
math        int64
dtype: object

In [4]:

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

In [5]:

df.dtypes  # 改变后

Out[5]:

name        object
sex         object
chinese    float64
math         int64
dtype: object

使用2:自定义函数

In [6]:

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

In [7]:

df["sex"] = df["sex"].apply(change_sex)

df  # 改变后
e607c698f48d35759622d5bf6a72ff32.jpeg

使用3:匿名函数lambda

In [8]:

# float--->int

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

df.dtypes

Out[8]:

name       object
sex         int64
chinese     int64
math        int64
dtype: object

In [9]:

# 将name变成首字母大写

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

df
6548330fca1f3aba93b81db5fb8389e2.jpeg
# 同时操作两列,记得axis=1

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

函数agg

操作Series数据

In [11]:

# 1

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

Out[11]:

mean     90.5
sum     362.0
Name: chinese, dtype: float64

操作DataFrame数据

In [12]:

# 2

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

Out[12]:


chinese math
sum 362.0 NaN
mean NaN 92.0

In [13]:

# 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]:

# 4

df.groupby("sex").agg(["mean","sum"])
dc5d2f60ce87d050768128a8f5e5f5cd.jpeg
# 5
df.groupby("sex").agg({"chinese":["mean"], "math":["sum","min","max"]})
162d2e5d0ed51b9e50dac5d8d6a6af02.jpeg

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

df.groupby("sex").agg(chinese_mean=("chinese","mean"), math_min=("chinese","min"))
3f682201d8b48b3778fe5d6730308a0a.jpeg

函数transform

现在的df是这样子:

43b61ab395f9444ae0fe409828c9bf09.jpeg

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

方法1:使用groupby + merge

In [18]:

# 1、先groupby

df1 = df.groupby("sex")["chinese"].mean().reset_index()
df1.columns = ["sex", "average"]
df1
16850ddb346c40990b420f55ff2ee41f.jpeg
# 2、merge

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

方法2:groupby + map

In [20]:

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

Out[20]:

{0: 96.0, 1: 85.0}

In [21]:

df["average_map"] = df["sex"].map(dic)
df
4d4c4f769637d08c0dd4da3353dceb9f.jpeg

方法3:使用transform

使用transform可以一步到位

df["average_tran"] = df.groupby("sex")["chinese"].transform("mean")
df
c1bf780116e6b2f996126031b10bf6cb.jpeg


推荐阅读:

我的2022届互联网校招分享

我的2021总结

浅谈算法岗和开发岗的区别

互联网校招研发薪资汇总
2022届互联网求职现状,金9银10快变成铜9铁10!!

公众号:AI蜗牛车

保持谦逊、保持自律、保持进步

发送【蜗牛】获取一份《手把手AI项目》(AI蜗牛车著)
发送【1222】获取一份不错的leetcode刷题笔记

发送【AI四大名著】获取四本经典AI电子书

猜你喜欢

转载自blog.csdn.net/qq_33431368/article/details/126277006
今日推荐