楔子

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. tween.js的API实践

    看了网上多篇关于tween的使用教程,基本上千篇一律,大多数的写法都是像下面这样: function initTween(geometry) { }; tween = }, ); tween.easi ...

  2. .net代码混淆 .NET Reactor 研究 脚本一键混淆一键发布

    .net代码混淆 .NET Reactor 研究 为什么要混淆? .net比较适合快速开发桌面型应用,但缺点是发布出来的文件是可以反编译的,有时候为了客户的安全,我们的代码或者我们的逻辑不想让别人知道 ...

  3. H5本地存储技术

    H5 Web存储技术 前言 web存储技术在初期的时候被定义为HTML5的一部分作为其API.后来被独立出来作为一份独立的标准. web存储标准包含localStorage对象和sessionStor ...

  4. JavaScript基础入门09

    目录 JavaScript 基础入门09 Event 自定义右键菜单 获取鼠标按键 获取鼠标坐标 获取键盘按键 页面中位置的获取 浏览器的默认行为 冒泡 什么是冒泡 小练习 JavaScript 基础 ...

  5. .net core cookie滑动过期设置

    HttpContext.SignInAsync( CookieAuthenticationDefaults.AuthenticationScheme, userPrincipal, new Authe ...

  6. XCTF (app1)

    打开app.一个文本框,随便输入提示如下图. 打开JEB反编译. v2调用getPackageInfo获取版本信息.一般 Android 通过 PackageInfo 这个类来获取应用安装包信息,比如 ...

  7. python selenium API 常用方法

    配置使用环境 下载相应的浏览器驱动, Firefox 是默认的 本文以 chrome 为主 ,放在scripts目录下ChromeDriver 官方下载地址 : 所有版本的 ChromeDriver ...

  8. 【VS开发】浅谈C/C++中的static和extern关键字

    一.C语言中的static关键字 在C语言中,static可以用来修饰局部变量,全局变量以及函数.在不同的情况下static的作用不尽相同. (1)修饰局部变量 一般情况下,对于局部变量是存放在栈区的 ...

  9. MHA简单部署

    MHA是目前比较成熟的mysql高可用集群方式之一. 一.参考文档:1.官方文档:[ https://github.com/yoshinorim/mha4mysql-manager/wiki ]2.个 ...

  10. gzip 命令

    NAME gzip -- compression/decompression tool using Lempel-Ziv coding (LZ77) SYNOPSIS gzip [-cdfhkLlNn ...