一篇搞定pandas语法,建议收藏

2023-10-29

导语

如果说大数据里面hive是屠龙刀,那么pandas则是倚天剑,帮助我们对数据数据挖掘、数据分析、数据清洗

本篇介绍了Pandas 一些基础的语法,以及使用技巧,建议收藏~

目录

  1. 数据准备

  2. Dataframe 基础操作

    2.1 查看

    2.2 修改

    2.3 过滤

    2.4 排序

    2.5 去重

    2.6 聚合

    2.7 关联

    2.8 自定义函数

    2.9 索引操作

    2.10 空值处理

    2.11 to_csv 写入csv文件

1. 数据准备

在python IDE平台上运行以下脚本:

import pandas as pd
import numpy as np

df=pd.DataFrame([['A10','Sone',2,'20200801'],
['A10','welsh',3,'20200801'],['A10','Sone',16,'20200801'],['A10','Albert',20,'20200802'],
['A10','GG',32,'  20200801'],['A20','Albert',42,'  20200801'],['A20','welsh',10,'20200801'],['A20','welsh',15,'20200802'],['A10','Albert',20,'20200801'],['A20','Sone',np.NaN,'20200802'],['A20','welsh',15,'20200802'],['A20','Albert',10,'20200802'],['A10','Jojo',16,'20200802'],
['A20','welsh',35,'20200803'],['A10','welsh',33,'20200803'],['A20','Sone',66,'20200803'],
['A20','Jojo',15,'20200802'],['A10','Albert',53,'20200803'],['A10','Jojo',12,'20200803'],
['A20','GG',35,'20200803'],['A20','J.K',30,'20200803']
],index=[[x for x in range(21)]], columns=['site_id','user_name','pv','dt'])

site=pd.DataFrame([['A02','北京东直门'],['A10','北京朝阳门店'],['A06','北京六里桥店'],['A20','北京西黄村店']],
                index=[[x for x in range(4)]],columns=['site_id','site_name'])

数据预览:

site_id user_name pv dt
A10 Sone 2 20200801
A10 welsh 3 20200801
A10 Sone 16 20200801
A10 Albert 20 20200802
A10 GG 32 20200801
A20 Albert 42 20200801
A20 welsh 10 20200801
A20 welsh 15 20200802
A10 Albert 20 20200801
A20 Sone NaN 20200802
A20 welsh 15 20200802
A20 Albert 10 20200802
A10 Jojo 16 20200802
A20 welsh 35 20200803
A10 welsh 33 20200803
A20 Sone 66 20200803
A20 Jojo 15 20200802
A10 Albert 53 20200803
A10 Jojo 12 20200803
A20 GG 35 20200803
A20 J.K 30 20200803

门店预览:

site_id user_name
A02 北京东直门
A10 北京朝阳门店
A06 北京六里桥店
A20 北京西黄村店

2. Dataframe 基础操作

Pandas的Dataframe 结构其实就是一种二维数组,由列、行、索引组成,跟mysql结构类似,

主要从表查看、修改、过滤、排序、聚合、关联、空值处理的一些基础语法介绍。

2.1 查看

  1. columns 获取列名
df.columns  
# 输出:
Index(['site_id', 'user_name', 'pv', 'dt'], dtype='object')
  1. index 获取索引
df.index   
# 输出:
MultiIndex([( 0,),
            ( 1,),
            ( 2,),
            ( 3,),
            ...
            (19,),
            (20,)],
           )
  1. values 获取数据
df.values  
# 输出:
array([['A10', 'Sone', 2, '20200801'],
       ['A10', 'welsh', 3, '20200801'],
       ['A10', 'Sone', 16, '20200801'],
       ['A10', 'Albert', 20, '20200802'],
       ...
       ['A10', 'Jojo', 12, '20200803'],
       ['A20', 'GG', 35, '20200803'],
       ['A20', 'J.K', 30, '20200803']], dtype=object)
  1. dtypes 查看类型
df.dtypes   
# 输出:
site_id      object
user_name    object
pv           object
dt           object
dtype: object

备注:进行2表之间关联时,往往需要确认关联的2个字段的类型是否一致,不一致时需要astype转化,例:df[“dt”] = df[“dt”].astype(“int64”)

  1. head 头部获取
df.head(2) # 展示头2行
# 输出:
	site_id	user_name	pv	dt
0	A10	Sone	Sone	20200801
1	A10	welsh	welsh	20200801
  1. df.xx/loc 列查看
df.name  # 单列展示
# 输出:
0       Sone
1      welsh
2       Sone
...
18      Jojo
19        GG
20       J.K
Name: user_name, dtype: object

df.loc[:,['name','pv']]  # 多列展示
# 输出:
	user_name	pv
0	Sone	2
1	welsh	3
2	Sone	16
...
19	GG	35
20	J.K	30
  1. iloc 行查看
df.iloc[[0,1,8],]  # 展示index为0、1、8的行
# 输出:
	site_id	user_name	pv	dt
0	A10	Sone	2	20200801
1	A10	welsh	3	20200801
8	A10	Albert	20	20200801
  1. shape 列行整体统计
df.shape  # 输出21列,4行
# 输出:
(21, 4)   
  1. count 某列统计
df.pv.count()   
# 输出:
20

说明:count() 统计的总数不包含NaN

2.2 修改

  1. rename 某列修改
df.rename(columns={'pv': 'page_view'})
# 输出:
	site_id	user_name	page_view	dt
0	A10	Sone	2.0	20200801
1	A10	welsh	3.0	20200801
2	A10	Sone	16.0	20200801
...
19	A20	GG	35.0	20200803
20	A20	J.K	30.0	20200803

说明:需要重新赋值给原表,原表值才会生效改变,df = df.rename(columns={‘pv’: ‘page_view’})

  1. drop 列去掉
df.drop(['dt'], axis=1)  
# 输出:
site_id	user_name	pv
0	A10	Sone	2.0
1	A10	welsh	3.0
2	A10	Sone	16.0
3	A10	Albert	20.0
...
19	A20	GG	35.0
20	A20	J.K	30.0

说明:需要重新赋值给原表,原表值才会生效改变,df = df.drop([‘dt’], axis=1)

  1. df[‘xx’] 某列新增
df['copy_dt']=df['dt']  # 新增df['copy_dt']列,复制['dt']这列而来
df
# 输出:
	site_id	user_name	pv	dt	copy_dt
0	A10	Sone	2.0	20200801	20200801
1	A10	welsh	3.0	20200801	20200801
2	A10	Sone	16.0	20200801	20200801
...
19	A20	GG	35.0	20200803	20200803
20	A20	J.K	30.0	20200803	20200803

2.3 过滤

  1. df[xx>x] 单条件过滤
df[df.pv>30]  # pv值大于30的数据
# 输出:
site_id	user_name	pv	dt
4	A10	GG	32.0	20200801
5	A20	Albert	42.0	20200801
13	A20	welsh	35.0	20200803
14	A10	welsh	33.0	20200803
15	A20	Sone	66.0	20200803
17	A10	Albert	53.0	20200803
19	A20	GG	35.0	20200803
  1. df[(xx>x)&(yy==y)] 多条件过滤
df["dt"] = df["dt"].astype("int64")  # 先将dt转换成int64类型
df[(df.pv>30) & (df.dt==20200801)]   # 过滤出pv>30 且 dt是0801这天的
# 输出:
	site_id	user_name	pv	dt
4	A10	GG	32.0	20200801
5	A20	Albert	42.0	20200801

2.4 排序

  1. sort_values 基于值排序
df.sort_values(by=["pv"],ascending=False) # pv 倒叙

# 输出:
	site_id	user_name	pv	dt
15	A20	Sone	66.0	20200803
17	A10	Albert	53.0	20200803
5	A20	Albert	42.0	20200801
19	A20	GG	35.0	20200803
...
1	A10	welsh	3.0	20200801
0	A10	Sone	2.0	20200801
9	A20	Sone	NaN	20200802

df.sort_values(by=["pv"],ascending=True) # pv 正序
# 输出:
	site_id	user_name	pv	dt
0	A10	Sone	2.0	20200801
1	A10	welsh	3.0	20200801
11	A20	Albert	10.0	20200802
6	A20	welsh	10.0	20200801
...
17	A10	Albert	53.0	20200803
15	A20	Sone	66.0	20200803
9	A20	Sone	NaN	20200802

说明:pv是null的数据,无论是正序还是倒叙均排在最后,进行排序时需要先进行null值处理

  1. sort_index 基于index排序
df=df.sort_index(axis=0)

# 输出:
	site_id	user_name	pv	dt
0	A10	Sone	2.0	20200801
1	A10	welsh	3.0	20200801
2	A10	Sone	16.0	20200801
...
19	A20	GG	35.0	20200803
20	A20	J.K	30.0	20200803

说明:当我们进行聚合后index会乱序,所以这些我们需要用到基于index进行排序

2.5 去重统计

  1. nunique 基于某列去重
df.groupby('site_id').agg({'user_name': pd.Series.nunique})  # A10下5个用户,A20下6个用户

# 输出:
	        user_name
site_id	
A10	       5
A20	       6

2.6 聚合

  1. groupby(‘xx’) 基于单列聚合
df.groupby('site_id').count() 

# 输出:
	       user_name	pv	dt
site_id			
A10	     10	10	10
A20	     11	10	11

df.groupby('site_id').min() 
# 输出:
	       user_name	pv	dt
site_id			
A10	     Albert	2.0	20200801
A20	     Albert	10.0	20200801

df.groupby('site_id').max()
# 输出:
	       user_name	pv	dt
site_id			
A10	     welsh	53.0	20200803
A20	     welsh	66.0	20200803

说明:聚合函数支持:count()| min()| max()| avg()| meav()| std() | var() ,计算非NaN的数据

  1. groupby([‘xx’,‘yy’]).agg 基于多列聚合
df.groupby(['site_id','user_name']).agg({'pv': 'sum','dt':'count'})

# 输出:
		                pv	dt
site_id	 user_name		
A10	     Albert	   93.0	3
         GG	       32.0	1
         Jojo	     28.0	2
         Sone	     18.0	2
         welsh	   36.0	2
A20	     Albert	   52.0	2
         GG	    	 35.0	1
         J.K	     30.0	1
         Jojo      15.0	1
         Sone      66.0	2
         welsh	   75.0	4

2.7 关联

  1. merge 基于字段关联
df= pd.merge(df,site,how='inner',on='site_id')

# 输出:
	site_id	user_name	pv	dt	site_name
0	A10	Sone	2.0	20200801	北京朝阳门店
1	A10	welsh	3.0	20200801	北京朝阳门店
...
19	A20	GG	35.0	20200803	北京西黄村店
20	A20	J.K	30.0	20200803	北京西黄村店
  1. left_index 基于index关联
df = df.groupby("site_id").count()
df= pd.merge(df,site,how='inner',left_index=True,right_on="site_id")

# 输出:
  user_name	pv	dt	site_id	site_name
1	10	     10	  10	A10	    北京朝阳门店
3	11	     10	  11	A20	    北京西黄村店

说明: 表A基于site_id字段进行聚合后,然后site_id字段变成表A的index,然后表A的index与表B的字段site_id在进行聚合,最终带出site_name

2.8 自定义函数

  1. 例如我们想将 pv 与 dt字段进行拼接后生成,可以用apply 之 lambda 函数实现
df['pv']=df['pv'].astype("str")      # pv字段转成str
df['dt']=df['dt'].astype("str")      # dt字段转成str     

df['pv_dt'] = df.apply(lambda r:(r['pv'] +"_"+ r['dt']),axis=1)  # 将pv与dt进行拼接

# 输出:
	site_id	user_name	pv	dt	pv_dt
0	A10	Sone	2.0	20200801	2.0_20200801
1	A10	welsh	3.0	20200801	3.0_20200801
2	A10	Sone	16.0	20200801	16.0_20200801
...
18	A10	Jojo	12.0	20200803	12.0_20200803
19	A20	GG	35.0	20200803	35.0_20200803
20	A20	J.K	30.0	20200803	30.0_20200803
  1. 方法二,自定义函数
def str_split(sub_pdf:pd.DataFrame):
    	sub_pdf['pv_dt'] = sub_pdf['pv']+"_"+sub_pdf['dt']
    	return sub_pdf
      
df['ab_pro'] = df.apply(str_split, axis=1)

# 输出:
	site_id	user_name	pv	dt	pv_dt
0	A10	Sone	2.0	20200801	2.0_20200801
1	A10	welsh	3.0	20200801	3.0_20200801
2	A10	Sone	16.0	20200801	16.0_20200801
...
18	A10	Jojo	12.0	20200803	12.0_20200803
19	A20	GG	35.0	20200803	35.0_20200803
20	A20	J.K	30.0	20200803	30.0_20200803

2.9 索引操作

  1. reset_index 重排序索引,一般是针对聚合后的数据,对其索引进行重排
df = df.groupby("user_name").count()  # 此时索引是user_name

# 输出:
	         site_id	pv	dt
user_name			
Albert	   5	5	5
GG	       2	2	2
J.K	       1	1	1
Jojo       3	3	3
Sone       4	3	4
welsh      6	6	6

df.reset_index('user_name')

# 输出:
	  user_name	site_id	pv	dt      # 重排后的索引
0	  Albert	5	5	5
1	  GG	2	2	2
2	  J.K	1	1	1
3	  Jojo	3	3	3
4	  Sone	4	3	4
5	  welsh	6	6	6

  1. set_index 某列指定为索引
df.set_index("site_id")

# 输出:
	        user_name	pv	dt
site_id			
A10	       Sone	2.0	20200801
A10	       welsh	3.0	20200801
A10	       Sone	16.0	20200801
...
A20	       Jojo	15.0	20200802
A10	       Albert	53.0	20200803
A10	       Jojo	12.0	20200803

2.10 空值处理

  1. isnull() 空值统计,True表示该列含有空值,false表示该列不含空值,通常与any()看哪些列是空值,sum()看各列空值的数量
df.isnull().any() # 统计

# 输出:
site_id      False
user_name    False
pv            True
dt           False
dtype: bool

df.isnull().sum()

# 输出:
site_id      0
user_name    0
pv           1
dt           0
dtype: int64
  1. notnull() 非空统计,True表示该列含有非空,false表示该列全为空值,
df.notnull().any() 

# 输出:
site_id      True
user_name    True
pv           True
dt           True
dtype: bool
  1. 空值填充, Sone的pv值被填充为0
df['pv'] = df.pv.fillna(0)  
df
# 输出:
	site_id	user_name	pv	dt
0	A10	Sone	2.0	20200801
1	A10	welsh	3.0	20200801
..
9	A20	Sone	0.0	20200802
...
20	A20	J.K	30.0	20200803

2.11 to_csv 写入csv文件

df.to_csv("pv.csv")

3. Series 基础操作

Pandas的Series 结构其实就是一种一维数组,由列、索引组成,类似一种单列的mysql表结构,从查看、统计、过滤、聚合、。

3.1 查看

  1. head 头部查看
user_name = df['user_name']
user_name.head(2)

# 输出:
0     Sone
1    welsh
Name: user_name, dtype: object

3.2 统计

  1. shape 行统计
user_name = df['user_name']
user_name.shape

# 输出:
(21,)

3.3 过滤

  1. df[xx==‘x’]
user_name = df['user_name']
user_name[user_name=='Sone']

# 输出:
0     Sone
2     Sone
9     Sone
15    Sone
Name: user_name, dtype: object

3.4 排序

  1. sort_values
user_name = df['user_name']
user_name.sort_values() 

# 输出:
17    Albert
3     Albert
5     Albert
8     Albert
...
13     welsh
14     welsh
7      welsh
6      welsh
1      welsh
10     welsh
Name: user_name, dtype: object

3.5 聚合

user_name = df['user_name']
user_name.count()

# 输出:
21

3.6 空值处理

  1. isnull()空值统计
pv = df['pv']
pv.isnull().sum()

# 输出:
1
  1. fillna(0)空值统计
pv = df['pv']
pv = pv.fillna(0)

# 输出:
0      2.0
...
9      0.0
...
20    30.0
Name: pv, dtype: float64

关注我的微信公众号【数据猿温大大】

获取 pandas官方文档中文版

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一篇搞定pandas语法,建议收藏 的相关文章

随机推荐

  • Prompt入门

    Prompt的范式大抵是两种 续写Prefix 用在GPT2 3那种单向LM预训练模型上 输入 好好学习 翻译成英文 输出 good good study 完形填空 用在BERT那种MLM式预训练模型上 比如情感分类任务可以输入 这个饼不错
  • Idea 中 Git 不提交当前分支修改代码并切换分支

    1 当前分支修改代码切换分支 日常开发中 我们可能会碰到我们正在修改当前 01 分支的代码 突然要去修改另外一个 02 分支的代码情况 而我们 01 分支写的代码还未经过测试 并不能马上提交 这个时候我们切换到 02 分支就会有问题 比如弹
  • dubbo中的Mock实现机制

    Mock是SOA之中的一个很有用的功能 不仅可以用来进行服务降级 也可以用来在测试中模拟服务调用的各种异常情况 dubbo框架里面的mock是在服务使用者这一端实现的 下面对实现机制进行分析 1 Mock的植入 很显然 既然提供了mock机
  • C++spdlog学习总结

    C Spdlog学习笔记 spdlog简介 spdlog优点 一般日志功能设计 spdlog安装 spdlog琐碎知识点总结 spdlog程序测试 一 日志输出控制台 1 数据全部输出到控制台 2 指定某个等级以上的数据到控制台 二 输出格
  • OC门与OD门

    OC门与OD门 OC Open Collector 集电极开路 OD Open Drain 漏极输出 集电极开路输出的结构如下图所示 右边的那个三极管集电极什么都不接 所以叫做集电极开路 左边的三极管为反相使用 使输入为 0 时 输出也为
  • 底层进阶

    在知乎上关注了好多图形学大佬 感觉现在知乎的技术氛围要比掘金推荐旧文好多了 经常会推送感兴趣的领域内容 而且还可以和作者私信交流 这段时间看到有大佬分享 GPU 架构相关的内容 做图像渲染的还是要懂 GPU 才行的 毕竟是和它打交道嘛 这位
  • springboot @CreatedDate @LastModifiedDate 自动生成创建时间,修改时间

    CreatedDate或 LastModifiedDate 在实体类的属性上加上上面的注解 即可不用处理时间的问题 在插入时会自动生成创建时间 修改时自动更新修改时间 搭配 Column updatable false 使用 注解起作用还需
  • C++ 随机数的制作

    include
  • Spring security安全登录-当AJAX遇上Redirect

    前言 最近做平台引入spring security做为安全认证框架 在登录的时候使用的ajax的请求方式 最开始的做法是调用登录的接口 成功后再前端使用window location href index html的方式跳转到希望的页面 考
  • kali linux 2020.4 自带浏览器英文改中文

    刚开始用kali linux 可能一些伙伴也会像我一样遇到英文不通的情况 比如 系统自带的火狐浏览器是英文的 要变成中文直接敲入 sudo apt install firefox esr l10n zh cn y 然后重启一下火狐浏览器就可
  • 【Unity+MySQL】实现简单的注册登录系统

    目录 1 安装Unity引擎和Navicat软件 2 安装MySQL8 0数据库 2 1 下载msi文件 2 2 安装MySQL Server 8 0 2 3 配置环境变量 2 4 安装MySQL服务 2 5 开启MySQL服务 2 6 修
  • 软件外包开发项目管理工具

    随着软件项目的规模越做越大 项目管理人员需要使用工具管理项目进度 从而更有成效的管理好软件开发进度 软件开发的进度管理工具有很多 今天和大家分享一些常用的系统工具 希望对大家有所帮助 北京木奇移动技术有限公司 专业的软件外包开发公司 欢迎交
  • Hololens 学习-----1

    ww 学习资料 基本操作 链接 https learn microsoft com zh cn hololens hololens2 basic usage 链接 https learn microsoft com zh cn window
  • Java中Collection集合和Map集合详解(进阶三)

    目录 友情提醒 第一部分 单列集合 第一章 单列集合体系 Collection接口 1 1 单列集合是什么 与数组的区别在哪 1 2 单列集合体系与分类 第二章 单例集合体系Collection下的List接口 Set接口 2 0 List
  • JAVA随机生成十个不重复的整数(Arraylist,Set)

    随机生成十个不重复的整数有许多方法 这里我只写出两种 第一种 Set 先上代码 import java util HashSet import java util Set public class Demo01 public static
  • (Java)leetcode-337 House Robber III(打家劫舍III)

    题目描述 在上次打劫完一条街道之后和一圈房屋后 小偷又发现了一个新的可行窃的地区 这个地区只有一个入口 我们称之为 根 除了 根 之外 每栋房子有且只有一个 父 房子与之相连 一番侦察之后 聪明的小偷意识到 这个地方的所有房屋的排列类似于一
  • CAN芯片_ TJA1051T/3

    前不久画了块板子 STM32F407VET6加CAN芯片的 如下图 这个电路是从正点原子抄过来的 但是板子打出来发现用不了 换上正点原子STM32F429开发板上的CAN芯片后就能正常工作了 仔细观察后发现两个芯片不太一样 我们买的是TJA
  • Windows 10 安装 PostgreSQL 12.x 报错 ‘psql‘ 不是内部或外部命令 & 由于找不到文件libintl-9.dll等问题

    目录 序言 一 问题总结 问题 1 psql 不是内部或外部命令 也不是可运行的程序或批处理文件 问题 2 由于找不到文件libintl 9 dll 无法继续执行代码 重新安装程序可能会解决此问题 1 卸载 2 安装 3 安装 Stack
  • 8年经验之谈 —— 35岁以上的测试开发工程师都去哪里了?

    测试开发工程师就是吃青春饭 35岁就是测试开发工程师的天花板 没有工作机会了 测试开发工程师趁早转行 不然迟早失业 网上对测试开发工程师不友好的言论非常多 真的是这样吗 如果不是这样 那么35岁以上的测试开发工程师去哪里了呢 行业内转岗 一
  • 一篇搞定pandas语法,建议收藏

    导语 如果说大数据里面hive是屠龙刀 那么pandas则是倚天剑 帮助我们对数据数据挖掘 数据分析 数据清洗 本篇介绍了Pandas 一些基础的语法 以及使用技巧 建议收藏 目录 数据准备 Dataframe 基础操作 2 1 查看 2