惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The GitHub Blog
The GitHub Blog
云风的 BLOG
云风的 BLOG
T
Threatpost
WordPress大学
WordPress大学
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
PCI Perspectives
PCI Perspectives
T
The Exploit Database - CXSecurity.com
Y
Y Combinator Blog
雷峰网
雷峰网
爱范儿
爱范儿
The Hacker News
The Hacker News
Last Week in AI
Last Week in AI
Simon Willison's Weblog
Simon Willison's Weblog
T
Tor Project blog
S
Securelist
宝玉的分享
宝玉的分享
L
LangChain Blog
O
OpenAI News
AI
AI
P
Privacy International News Feed
L
LINUX DO - 最新话题
D
DataBreaches.Net
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Attack and Defense Labs
Attack and Defense Labs
罗磊的独立博客
M
MIT News - Artificial intelligence
Security Archives - TechRepublic
Security Archives - TechRepublic
月光博客
月光博客
博客园 - 【当耐特】
T
Tailwind CSS Blog
C
Cybersecurity and Infrastructure Security Agency CISA
H
Help Net Security
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园_首页
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Hacker News - Newest:
Hacker News - Newest: "LLM"
腾讯CDC
Jina AI
Jina AI
The Last Watchdog
The Last Watchdog
K
Kaspersky official blog
Webroot Blog
Webroot Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Blog — PlanetScale
Blog — PlanetScale
MyScale Blog
MyScale Blog
MongoDB | Blog
MongoDB | Blog
P
Proofpoint News Feed
Recorded Future
Recorded Future
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
博客园 - 三生石上(FineUI控件)
The Cloudflare Blog

极客兔兔

Go sync.Cond | Go 语言高性能编程 Go 死码消除与调试(debug)模式 | Go 语言高性能编程 Go sync.Once | Go 语言高性能编程 Go 逃逸分析 | Go 语言高性能编程 2020 年终总结 | 极客兔兔 Go struct 内存对齐 | Go 语言高性能编程 Go 空结构体 struct{} 的使用 | Go 语言高性能编程 控制协程(goroutine)的并发数量 | Go 语言高性能编程 | 极客兔兔 如何退出协程 goroutine (其他场景) | Go 语言高性能编程 如何退出协程 goroutine (超时场景) | Go 语言高性能编程 Go 语言陷阱 - 数组和切片 | Go 语言高性能编程 减小 Go 代码编译后的二进制体积 | Go 语言高性能编程 Go Reflect 提高反射性能 | Go 语言高性能编程 读写锁和互斥锁的性能比较 | Go 语言高性能编程 | 极客兔兔 for 和 range 的性能比较 | Go 语言高性能编程 切片(slice)性能及陷阱 | Go 语言高性能编程 | 极客兔兔 字符串拼接性能及原理 | Go 语言高性能编程 | 极客兔兔 pprof 性能分析 | Go 语言高性能编程 benchmark 基准测试 | Go 语言高性能编程 Go 语言高性能编程 | 极客兔兔 Go 接口型函数的使用场景 | 极客兔兔 Python 简明教程 | 快速入门 | 极客兔兔 Go 语言笔试面试题(代码输出) | 极客面试 | 极客兔兔 动手写RPC框架 - GeeRPC第七天 服务发现与注册中心(registry) | 极客兔兔 动手写RPC框架 - GeeRPC第六天 负载均衡(load balance) 动手写RPC框架 - GeeRPC第五天 支持HTTP协议 | 极客兔兔 动手写RPC框架 - GeeRPC第四天 超时处理(timeout) | 极客兔兔 动手写RPC框架 - GeeRPC第三天 服务注册(service register) 动手写RPC框架 - GeeRPC第二天 支持并发与异步的客户端 | 极客兔兔 动手写RPC框架 - GeeRPC第一天 服务端与消息编码 | 极客兔兔 7天用Go从零实现RPC框架GeeRPC | 极客兔兔 Go 语言笔试面试题(并发编程) | 极客面试 | 极客兔兔 Go 语言笔试面试题(基础语法) | 极客面试 | 极客兔兔 Go 语言笔试面试题汇总 | 极客面试 | 极客兔兔 Go Context 并发编程简明教程 | 快速入门 Go Mmap 文件内存映射简明教程 | 快速入门 动手写ORM框架 - GeeORM第七天 数据库迁移(Migrate) | 极客兔兔 动手写ORM框架 - GeeORM第六天 支持事务(Transaction) | 极客兔兔 动手写ORM框架 - GeeORM第五天 实现钩子(Hooks) | 极客兔兔 动手写ORM框架 - GeeORM第四天 链式操作与更新删除 | 极客兔兔 动手写ORM框架 - GeeORM第三天 记录新增和查询 | 极客兔兔 动手写ORM框架 - GeeORM第二天 对象表结构映射 | 极客兔兔 动手写ORM框架 - GeeORM第一天 database/sql 基础 SQLite 常用命令 | 速查表(Cheat Sheet) 7天用Go从零实现ORM框架GeeORM | 极客兔兔 动手写分布式缓存 - GeeCache第七天 使用 Protobuf 通信 动手写分布式缓存 - GeeCache第六天 防止缓存击穿 | 极客兔兔 动手写分布式缓存 - GeeCache第五天 分布式节点 | 极客兔兔 动手写分布式缓存 - GeeCache第四天 一致性哈希(hash) | 极客兔兔 Go Mock (gomock)简明教程 | 快速入门 动手写分布式缓存 - GeeCache第三天 HTTP 服务端 动手写分布式缓存 - GeeCache第二天 单机并发缓存 | 极客兔兔 Go Test 单元测试简明教程 | 快速入门 7天用Go从零实现分布式缓存GeeCache | 极客兔兔 Go WebAssembly (Wasm) 简明教程 | 快速入门 Go RPC & TLS 鉴权简明教程 | 快速入门 Go Protobuf 简明教程 | 快速入门 Go语言动手写Web框架 - Gee第七天 错误恢复(Panic Recover) WSL, Git, Mircosoft Terminal 等常用工具配置 Rust 简明教程 | 快速入门 | 极客兔兔 Go语言动手写Web框架 - Gee第六天 模板(HTML Template) 百宝箱 - 值得收藏的工具网站 | 极客兔兔 Go语言动手写Web框架 - Gee第五天 中间件Middleware | 极客兔兔 Go语言动手写Web框架 - Gee第四天 分组控制Group | 极客兔兔 Go语言动手写Web框架 - Gee第三天 前缀树路由Router | 极客兔兔 博客折腾记(七) - Gitalk Plus | 极客兔兔 Go语言动手写Web框架 - Gee第二天 上下文Context | 极客兔兔 Go2 新特性简明教程 | 快速入门 | 极客兔兔 博客折腾记(六) - 不要为了流量忘记了初心 | 极客兔兔 Go语言动手写Web框架 - Gee第一天 http.Handler | 极客兔兔 7天用Go从零实现Web框架Gee教程 | 极客兔兔 Go Gin 简明教程 | 快速入门 Go 语言简明教程 | 快速入门 | 极客兔兔 机器学习笔试面试题 11-20 | 极客面试 | 极客兔兔 机器学习笔试面试题 1-10 | 极客面试 | 极客兔兔 机器学习笔试面试题汇总 | 极客面试 | 极客兔兔 TensorFlow 2 中文文档 - RNN LSTM 文本分类 TensorFlow 2 中文文档 - TFHub 迁移学习 TensorFlow 2 中文文档 - 卷积神经网络分类 CIFAR-10 TensorFlow 2 中文文档 - 保存与加载模型 TensorFlow 2 中文文档 - 过拟合与欠拟合 TensorFlow 2 中文文档 - 回归预测燃油效率 TensorFlow 2 中文文档 - 特征工程结构化数据分类 TensorFlow 2 中文文档 - IMDB 文本分类 TensorFlow 2 中文文档 - MNIST 图像分类 TensorFlow 2 / 2.0 中文文档 TensorFlow 2.0 (九) - 强化学习 70行代码实战 Policy Gradient 博客折腾记(五) - 友链这件事,没那么简单 | 极客兔兔 博客折腾记(四) - 原创资格是争取来的 | 极客兔兔 TensorFlow 2.0 (八) - 强化学习 DQN 玩转 gym Mountain Car TensorFlow 2.0 (七) - 强化学习 Q-Learning 玩转 OpenAI gym 博客折腾记(三) - 主题设计、彩蛋与阅读量翻倍 | 极客兔兔 TensorFlow 2.0 (六) - 监督学习玩转 OpenAI gym game 博客折腾记(二) - 对搜索引擎的理解 | 极客兔兔 博客折腾记(一) - 极致性能的尝试 | 极客兔兔 Pandas 数据处理(三) - Cheat Sheet 中文版 TensorFlow 2.0 (五) - mnist手写数字识别(CNN卷积神经网络) TensorFlow入门(四) - mnist手写数字识别(制作h5py训练集) | 极客兔兔 TensorFlow入门(三) - mnist手写数字识别(可视化训练) | 极客兔兔 Pandas 数据处理(一) - DataFrame 与 Series
Pandas 数据处理(二) - 筛选数据 | 极客兔兔
2018-03-21 · via 极客兔兔

使用demo.csv举几个栗子~

1
2
3
4
5
6
编号,日期,单价,数量
T001,2018-03-02 12:34:05,100,3
T002,2018-03-02 13:04:05,200,3
T003,2018-03-03 18:12:31,30,10
T004,2018-03-04 20:34:05,400,2
T005,2018-03-02 20:34:05,500,1
1
2
3
4
5
6
7
8
9
10
11
12
import pandas as pd

df = pd.read_csv('demo.csv', index_col='编号')
"""
日期 单价
编号
T001 2018-03-02 12:34:05 100
T002 2018-03-02 13:04:05 200
T003 2018-03-03 18:12:31 30
T004 2018-03-04 20:34:05 400
T005 2018-03-02 20:34:05 500
"""

如果不指定 index_col,则会默认生成 0 - 5的行标签,这种情况下,行标签与行号相等。

行标签可以理解为这一行的区别于其他行的标志(类似SQL中的主键)

1
2
3
4
5
6
7
8
9
df_without_index_col = pd.read_csv('demo.csv')
"""
编号 日期 单价 数量
0 T001 2018-03-02 12:34:05 100 3
1 T002 2018-03-02 13:04:05 200 3
2 T003 2018-03-03 18:12:31 30 10
3 T004 2018-03-04 20:34:05 400 2
4 T005 2018-03-02 20:34:05 500 1
"""

一、选取列

1. 使用方括号

1
2
3
4
5
6
7
8
9
10
df[['日期', '单价']]
"""
日期 单价
编号
T001 2018-03-02 12:34:05 100
T002 2018-03-02 13:04:05 200
T003 2018-03-03 18:12:31 30
T004 2018-03-04 20:34:05 400
T005 2018-03-02 20:34:05 500
"""
1
2
3
4
5
6
7
8
9
10
11
df[['单价']] 
"""
单价
编号
T001 100
T002 200
T003 30
T004 400
T005 500
"""
type(df[['单价']])
1
2
3
4
5
6
7
8
9
10
11
df['单价'] 
"""
编号
T001 100
T002 200
T003 30
T004 400
T005 500
Name: 单价, dtype: int64
"""
type(df['单价'])

二、选取行

1. 行标签使用loc

可接受2个参数,第一个参数是行标签,第二个参数是列标签

  • 行标签为T002的行
1
2
3
4
5
6
7
df.loc['T002'] 
"""
日期 2018-03-02 12:34:05
单价 100
数量 3
Name: T001, dtype: object
"""
  • 行标签从T002到 T004的行(与切片不同,这种情况下包含开头也包含结束)
1
2
3
4
5
6
7
8
df.loc['T002':'T004']  
"""
日期 单价 数量
编号
T002 2018-03-02 13:04:05 200 3
T003 2018-03-03 18:12:31 30 10
T004 2018-03-04 20:34:05 400 2
"""
  • 行标签从T002到最后的行,且只选取单价和数量2列
1
2
3
4
5
6
7
8
9
10
df.loc['T002':, ['单价', '数量']] 

"""
单价 数量
编号
T002 200 3
T003 30 10
T004 400 2
T005 500 1
"""

2. 行号使用iloc

  • 第1行到倒数第2行

iloc参数是一个slice对象,和python中可迭代对象用法是一致的。[start, end, step)。

下标从0开始,包含开头,不包含结束。

1
2
3
4
5
6
7
df.iloc[1:-2] 
"""
日期 单价 数量
编号
T002 2018-03-02 13:04:05 200 3
T003 2018-03-03 18:12:31 30 10
"""
  • 第1行到最后,隔行取,即行号为单数的行,1,3,5,7,9….
1
2
3
4
5
6
7
8
df.iloc[1::2] 

"""
日期 单价 数量
编号
T002 2018-03-02 13:04:05 200 3
T004 2018-03-04 20:34:05 400 2
"""
  • 第0行到第3行,第1列到第3列
1
2
3
4
5
6
7
8
df.iloc[:3, 1:3] 
"""
单价 数量
编号
T001 100 3
T002 200 3
T003 30 10
"""
  • 若没有指定标签列(index_col),则loc与iloc表现相近
1
2
3
4
5
6
7
8
9
10
11
12
13
df_without_index_col.loc[1:3] 
"""
编号 日期 单价 数量
1 T002 2018-03-02 13:04:05 200 3
2 T003 2018-03-03 18:12:31 30 10
3 T004 2018-03-04 20:34:05 400 2
"""
df_without_index_col.iloc[1:3]
"""
编号 日期 单价 数量
1 T002 2018-03-02 13:04:05 200 3
2 T003 2018-03-03 18:12:31 30 10
"""

3. ix兼容处理loc与iloc(deprecated)

loc是根据行标签定位的,iloc是根据行号定位的。

ix的处理逻辑是,通常将传入的参数优先视为行标签,若找不到该标签的情况下,再当做行号取索引。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
df.ix['T002':'T004'] 
"""
日期 单价 数量
编号
T002 2018-03-02 13:04:05 200 3
T003 2018-03-03 18:12:31 30 10
T004 2018-03-04 20:34:05 400 2
"""
df.ix[1:3]
"""
日期 单价 数量
编号
T002 2018-03-02 13:04:05 200 3
T003 2018-03-03 18:12:31 30 10
"""
df_without_index_col.ix[1:3]
"""
编号 日期 单价 数量
1 T002 2018-03-02 13:04:05 200 3
2 T003 2018-03-03 18:12:31 30 10
3 T004 2018-03-04 20:34:05 400 2
"""

ix方法虽然兼容处理了2种情况,但是建议不要使用,尽量使用loc和iloc明确索引方式。

更多的关于ix的讨论可以参考 pandas iloc vs ix vs loc explanation, how are they different?

当前ix方法已经处于 deprecated 状态。

三、简单条件

1. 简单的逻辑判断(<, >, ==, &, |, ~ 等)

  • 单价不小于200的记录
1
2
3
4
5
6
7
8
9
df[df['单价'] >= 200]

"""
日期 单价 数量
编号
T002 2018-03-02 13:04:05 200 3
T004 2018-03-04 20:34:05 400 2
T005 2018-03-02 20:34:05 500 1
"""
  • 单价大于等于200且数量大于1的记录(&表示与,|表示或,~表示非)
1
2
3
4
5
6
7
df[(df['单价'] >= 200) & (df['数量'] >= 2)]
"""
日期 单价 数量
编号
T002 2018-03-02 13:04:05 200 3
T004 2018-03-04 20:34:05 400 2
"""

四、自定义函数

1. loc

loc函数支持传入自定义的函数进行筛选

  • 筛选总价大于500的记录
1
2
3
4
5
6
7
8
9
10
11
12
df.loc[lambda x: x['单价'] * x['数量'] > 500] 
"""
日期 单价 数量
编号
T002 2018-03-02 13:04:05 200 3
T004 2018-03-04 20:34:05 400 2
"""

def filter_func(x):
print(type(x))
return x['单价'] * x['数量'] > 500
df.loc[filter_func]
  • 筛选3月2号的记录
1
2
3
4
5
6
7
8
9

df.loc[lambda x: x['日期'].str.startswith('2018-03-02')]
"""
日期 单价 数量
编号
T001 2018-03-02 12:34:05 100 3
T002 2018-03-02 13:04:05 200 3
T005 2018-03-02 20:34:05 500 1
"""

Series.str(),可以使用Python自带的string相关的方法,构造筛选条件。

查看官方文档pandas.Series.str

2. apply

  • 筛选总价大于500的记录
1
2
3
4
5
6
7
8
9
10
11
12
df[df.apply(lambda x: x['单价'] * x['数量'] > 500, axis=1)] 
"""
日期 单价 数量
编号
T002 2018-03-02 13:04:05 200 3
T004 2018-03-04 20:34:05 400 2
"""

def filter_func(x):
print(type(x))
return x['单价'] * x['数量'] > 500
df[df.apply(filter_func, axis=1)]

axis默认为0,表示遍历列,axis=1,表示遍历行。

更多参数,查看官方文档pandas.DataFrame.apply

  • 筛选3月2号的记录
1
2
3
4
5
6
7
8
9
10
df['日期'] = pd.to_datetime(df['日期'])

df[df.apply(lambda x: x['日期'].date() == pd.to_datetime('2018/03/02').date(), axis=1)]
"""
日期 单价 数量
编号
T001 2018-03-02 12:34:05 100 3
T002 2018-03-02 13:04:05 200 3
T005 2018-03-02 20:34:05 500 1
"""
  • 假如数据中单价包含非数字,需要删除
1
2
3
4
5
6
7
编号,日期,单价,数量
T001,2018-03-02 12:34:05,100,3
T002,2018-03-02 13:04:05,200,3
T003,2018-03-03 18:12:31,30,10
T004,2018-03-04 20:34:05,400,2
T005,2018-03-02 20:34:05,500,1
T006,2018-03-02 20:34:05,$#500,1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def filter_func(x):
try:
float(x['单价'])
return True
except:
return False


df = pd.read_csv('demo.csv', index_col='编号')
print(df[df.apply(filter_func, axis=1)])
"""
日期 单价 数量
编号
T001 2018-03-02 12:34:05 100 3
T002 2018-03-02 13:04:05 200 3
T003 2018-03-03 18:12:31 30 10
T004 2018-03-04 20:34:05 400 2
T005 2018-03-02 20:34:05 500.0 1
"""

附 推荐



上一篇 « Pandas 数据处理(一) - DataFrame 与 Series 下一篇 » TensorFlow入门(三) - mnist手写数字识别(可视化训练)

© 2026 - 极客兔兔 - 沪ICP备18001798号-1

👁   📚