楔子

pandas支持的功能已经非常强大了,但是本着程序猿的"懒惰"精神,还是想少写一点代码的。pandas中的某些方法不仅可以实现我们需要的功能,还可以减少一定的代码量,我们来看一下。

df.assign

这个方法估计有人没怎么用过,因为我们不用它也完全可以实现,那么它是干什么的呢?我们来看一下:

import pandas as pd

df = pd.DataFrame(
{"name": ["mashiro", "satori", "koishi"],
"date": pd.date_range("2018-1-1", "2018-1-3", freq="D")}
) print(df)
"""
name date
0 mashiro 2018-01-01
1 satori 2018-01-02
2 koishi 2018-01-03
"""
# 我们需要增加三个字段,分别存储date的年、月、日
# 之前的话,我们可能会这么做
df["year"], df["month"], df["day"] = (df["date"].dt.year,
df["date"].dt.month,
df["date"].dt.day)
print(df)
"""
name date year month day
0 mashiro 2018-01-01 2018 1 1
1 satori 2018-01-02 2018 1 2
2 koishi 2018-01-03 2018 1 3
"""

先说一下,上面的代码没有任何问题,非常标准的写法。但如果使用assign的话会更加方便

import pandas as pd

df = pd.DataFrame(
{"name": ["mashiro", "satori", "koishi"],
"date": pd.date_range("2018-1-1", "2018-1-3", freq="D")}
) print(df)
"""
name date
0 mashiro 2018-01-01
1 satori 2018-01-02
2 koishi 2018-01-03
""" df = df.assign(
year=df["date"].dt.year,
month=df["date"].dt.month,
day=df["date"].dt.day
)
print(df)
"""
name date year month day
0 mashiro 2018-01-01 2018 1 1
1 satori 2018-01-02 2018 1 2
2 koishi 2018-01-03 2018 1 3
"""

df.assign里面通过关键字参数传递,参数名会作为列名,参数值会作为列的值。

df.query

df.query,从名字上也能看出来这是用于筛选的。

import pandas as pd

df = pd.DataFrame(
{"name": ["mashiro", "satori", "koishi", "kurisu", "nagsia"],
"age": [17, 17, 16, 18, 21],
"height": [161, 155, 154, 172, 158],
"where": ["樱花庄", "地灵殿", "地灵殿", "石头门", "clannad"]
}
)
print(df)
"""
name age height where
0 mashiro 17 161 樱花庄
1 satori 17 155 地灵殿
2 koishi 16 154 地灵殿
3 kurisu 18 172 石头门
4 nagsia 21 158 clannad
""" # 筛选age > 17的
print(df.query("age > 17")) # 等价于df[df["age"] > 17]
"""
name age height where
3 kurisu 18 172 石头门
4 nagsia 21 158 clannad
""" # 筛选where == '地灵殿'的
print(df.query("where == '地灵殿'")) # 等价于df[df["where"] > "地灵殿"]
"""
name age height where
1 satori 17 155 地灵殿
2 koishi 16 154 地灵殿
""" # 筛选where == '地灵殿' 并且 age == 17的
# 等价于df[(df["where"] > "地灵殿") & (df["age"] == 17)]
print(df.query("where == '地灵殿' and age == 17"))
"""
name age height where
1 satori 17 155 地灵殿
""" # 筛选出身高大于年龄的,当然这个肯定都满足,只是演示一下query支持的功能
print(df.query("height > age")) # 等价于df[df["height"] >df["age"]]
"""
name age height where
0 mashiro 17 161 樱花庄
1 satori 17 155 地灵殿
2 koishi 16 154 地灵殿
3 kurisu 18 172 石头门
4 nagsia 21 158 clannad
""" # 另外如果字段名含有空格怎么办?我们将name变成na me
df = df.rename(columns={"name": "na me"})
# 这个时候应该将na me使用``包起来,告诉pandas,``里面的内容是一个整体。否则的话,是不会正确解析的
print(df.query("`na me` == 'satori'"))
"""
na me age height where
1 satori 17 155 地灵殿
""" # 查找age位于[17, 21]当中、并且where位于["樱花庄", "clannad]大当中的记录
print(df.query("age in [17, 21] and where in ['樱花庄', 'clannad']"))
"""
na me age height where
0 mashiro 17 161 樱花庄
4 nagsia 21 158 clannad
""" # 问题来了,如果我们外面有一个变量,我们怎么在query里面使用呢?
place = "地灵殿"
try:
print(df.query("where == place"))
except Exception as e:
# 尽管我们外面定义了place,但是不能再query里面直接使用
print(e) # name 'place' is not defined
# 如果使用的话,那么应该使用@作为前缀,来标识这是一个外面存在的变量
print(df.query("where == @place"))
"""
na me age height where
1 satori 17 155 地灵殿
2 koishi 16 154 地灵殿
""" l = [16, 18]
print(df.query("age in @l"))
"""
na me age height where
2 koishi 16 154 地灵殿
3 kurisu 18 172 石头门
""" # 也可以使用索引
print(df.query("age == @l[0]"))
"""
na me age height where
2 koishi 16 154 地灵殿
""" # 我们试一下函数
age = 17
def foo(x): return x
print(df.query("age == @foo(x=@age)"))
"""
na me age height where
0 mashiro 17 161 樱花庄
1 satori 17 155 地灵殿
"""
# 如果上面是可以的,那么age == @foo(@age)也是可以的,无参函数更是可以的 # 再试一下字典
d = {"age": 16}
try:
print(df.query("age == @d['age']"))
except Exception as e:
# 如果是通过中括号获取的话,那么[]里面不能出现''
print(e) # data type must provide an itemsize
# 所以我们可以通过字典的get方法获取
print(df.query("age == @d.get('age')"))
"""
na me age height where
2 koishi 16 154 地灵殿
""" # age1不存在,也自动使用了默认值
print(df.query("age == @d.get('age1', 16)"))
"""
na me age height where
2 koishi 16 154 地灵殿
""" # 回到通过中括号获取元素上面来,我们使用列表是可以通过[]获取指定元素的
# 因为列表里面指定的是数值,那么是不是意味着如果字典里面的key也是数值的话、我们就可以通过[]来获取呢
d = {16: 21}
# 显然答案是正确的
print(df.query("age == @d[16]"))
"""
na me age height where
4 nagsia 21 158 clannad
"""
# 所以对于字典来讲,如果通过[]获取的话,那么里面不能出现'',所以也就无法获取字符串
# 但是对于整型是可以的,因为不需要''括起来。
# 不过可能有人会问了,如果在外面定义一个变量age=16,然后再在query里面通过"age = @d[@age]"获取可不可以呢
# 因为此时[]里面没有出现''。答案也是不可以的,具体原因可以自己试着写一下。 # 总体来说query的功能还是能够支持我们大部分逻辑的

optparse:让你轻松地与命令行打交道的更多相关文章

  1. python模块----optparse模块、argparse模块 (命令行解析模块)

    简介 optparse module---自版本3.2以来已弃用:optparse模块已弃用,将不再进一步开发:将继续使用argparse模块进行开发.optparse使用一种更具声明性的命令行解析方 ...

  2. Python模块: 命令行解析optionparser

    Python 有两个内建的模块用于处理命令行参数:一个是 getopt,<Deep in python>一书中也有提到,只能简单处理 命令行参数:另一个是 optparse,它功能强大,而 ...

  3. optparse--强大的命令行参数处理包

    optparse,它功能强大,而且易于使用,可以方便地生成标准的.符合Unix/Posix 规范的命令行说明. optparse的简单示例: from optparse import OptionPa ...

  4. python命令行参数处理模块 optparse 使用参考

    from optparse import OptionParser parser = OptionParser() parser.add_option( '-f', '--file', dest='f ...

  5. optparse模块解析命令行参数的说明及优化

    一.关于解析命令行参数的方法 关于“解析命令行参数”的方法我们一般都会用到sys.argv跟optparse模块.关于sys.argv,网上有一篇非常优秀的博客已经介绍的很详细了,大家可以去这里参考: ...

  6. .NET 跨平台RPC框架DotNettyRPC Web后台快速开发框架(.NET Core) EasyWcf------无需配置,无需引用,动态绑定,轻松使用 C# .NET 0配置使用Wcf(半成品) C# .NET Socket 简单实用框架 C# .NET 0命令行安装Windows服务程序

    .NET 跨平台RPC框架DotNettyRPC   DotNettyRPC 1.简介 DotNettyRPC是一个基于DotNetty的跨平台RPC框架,支持.NET45以及.NET Standar ...

  7. optparse(命令行参数解析工具)

    在用Python做自动化的时候,命令行的解析一定是少不了的,有很多命令行解析工具库,其中Python内建的一个库optparse,还是比较好用的 1.贴代码并注释 # coding=UTF-8 fro ...

  8. [转]轻松学习Ionic (四) 修改应用图标及添加启动画面(更新官方命令行工具自动生成)

    本文转自:http://blog.csdn.net/zapzqc/article/details/42237935 由于Ionic更新了命令行工具,以后修改应用图标和添加启动画面就简单了,最新方法见最 ...

  9. 轻松学习Ionic (四) 修改应用图标及添加启动画面(更新官方命令行工具自动生成)

    由于Ionic更新了命令行工具,以后修改应用图标和添加启动画面就简单了,最新方法见最下方:   应用图标:   1.在整个项目所在文件夹下创建res文件夹,里边再分别创建两个文件夹android和io ...

随机推荐

  1. ABAP Field+offset字符串截取

    *删除字符串末尾的字符 DATA:str TYPE string VALUE 'abc,defg,', sub_str TYPE string, num TYPE i. WRITE:/ str. nu ...

  2. python多媒体文件抽取

    多文件抽取有:只获取url,或直接下载,下面是怎么将数据下载下来,并显示进度. 本节主要介绍urllib模块提供的urlretrieve()函数.urlretrieve()方法直接将远程数据下载到本地 ...

  3. 使用现代 C++ 技术增强多核优化

    在本文中,读者将了解如何使用现代 C++ 技术跨内核并行处理数据.通过研究示例代码,下载应用和学习技术,开发人员将更好地了解英特尔® 架构和多核技术.通过学习如何处理潜在的性能瓶颈和并发性问题,可以使 ...

  4. 进程,多进程,进程与程序的区别,程序运行的三种状态,multiprocessing模块中的Process功能,和join函数,和其他属性,僵尸与孤儿进程

    1.进程 什么是进程: 一个正在被运行的程序就称之为进程,是程序具体执行的过程,是一种抽象概念,进程来自操作系统 2.多进程  多个正在运行的程序 在python中实现多线程的方法 from mult ...

  5. 【CUDA开发】Thrust库

    Thrust库从C++的STL中得到灵感,将最简单的类似于STL的结构放在Thrust库中,比如STL中的vector.此外,Thrust库还包含STL中的算法和迭代器.        Thrust函 ...

  6. 客户端数据存储cookie、localStoeage、sessionStorage(小记)

    一.数据存储分为客户端存储和服务端存储 1.而对于客户端存储,在html5以前只能通过cookie来实现:html 5以后增加了web存储(实际保存本地)的功能   (1)对于web存储有两个标准: ...

  7. 影响mysql主从延迟速度的相关参数

    1.sync-binlog MySQL提供一个sync_binlog参数来控制数据库的binlog刷到磁盘上去. 默认,sync_binlog=0,表示MySQL不控制binlog的刷新,由文件系统自 ...

  8. 注入(Injection)

    注入(Injection)是: Java EE提供了注入机制,使您的对象能够获取对资源和其他依赖项的引用,而无需直接实例化它们.通过使用将字段标记为注入点的注释之一来装饰字段或方法,可以在类中声明所需 ...

  9. ASP.NET Core WebApi使用Swagger生成API说明文档【xml注释版】

    ⒈新建ASP.NET Core WebAPi项目 ⒉添加 NuGet 包 Install-Package Swashbuckle.AspNetCore ⒊Startup中配置 using System ...

  10. linux 使用tmux

    一. 什么是tmux 1.1. tmux 是两个单词的缩写,即“Terminal MultipleXer”,意思是“终端复用器“ 1.2. tmux 结构 1.2.1. tmux主要由三层: < ...