Panda处理文本和时序数据?首选向量化

导读

Pandas作为Python数据分析的首选框架,不仅功能强大接口丰富,而且执行效率也相比原生Python要快的多,这是得益于Pandas底层由C实现,同时其向量化执行方式也非常利于并行计算。更重要的是,这种向量化操作不仅适用于数值计算,对于文本和时间格式也有着良好的支持,而这就不得不从Pandas的属性接口谈起。

腾讯课堂 | Python网络爬虫与文本分析~~

说起Pandas中的属性接口,首先要从数据类型谈起。在任何一门编程语言中,虽然各自的数据类型有很多,比如数值型有int、long、double,字符串有str或者char类型,还有时间数据类型以及布尔数据类型等,可以说这数值型、字符串型、时间型以及布尔型基本覆盖了所有基本的数据类型。而像其他的数组、列表、字典等则都是集合类的数据结构,不属于基本数据类型。

数值型操作是所有数据处理的主体,支持程度自不必说,布尔型数据在Pandas中其实也有较好的体现,即通过&、|、~三种位运算符也相当于是实现了向量化的并行操作,那么对于字符串和时间格式呢?其实这就是本文今天要分享的重点内容:属性接口——str、dt,两类接口均用几个小例子简单粗暴的进行示范,即学即用!

严格意义上讲,Pandas中的属性接口除了str和dt外,还有枚举类型cat接口,但其实用法很小众,所以本文不予提及。

01 字符串接口——str

在Pandas中,当一列数据类型均为字符串类型时,则可对该列执行属性接口操作,即通过调用.str属性可调用一系列的字符串方法函数,其中这里的字符串方法不仅涵盖了Python中内置的字符串通用方法,比如split、strim等,还实现了正则表达式的绝大部分功能,包括查找、匹配和替换等、这对于Pandas处理文本数据来说简直是开挂一般的存在。

举个例子,例如构造如下虚拟DataFrame数据,其中所有列都用到了字符串类型:

df = pd.DataFrame({

对应数据表如下:

观察数据可见,name列字符串格式不是很统一,既有大小写混乱,也有-、#等其他无用字符,city列相对规整,但马超所在列不是xx省xx市结构,而salary均有薪资上下限组成,最后helpers列则是一个复合类型,各部下之间用空格进行区分。针对这一数据,需要完成如下处理需求:

  • 规整姓名列,均变为小写形式且过滤无用字符

  • 提取所在城市信息

  • 计算平均薪资

  • 提取部下人数信息

对于以上需求,用Pandas实现都非常之容易:

  • 姓名列统一小写,然后过滤掉非字母的字符,其中lower是Python字符串内置的通用方法,replace虽然是Pandas中的全局方法,但嵌套了一层str属性接口后即执行正则匹配的替换,这里即用到了正则表达式的匹配原则,即对a-z字母以外的其他字符替换为空字符:

  • 根据正则表达式,提取省市之间的城市信息,特别地,第二个关键词还可能是区,所以可用正则表达式中的findall提取功能,还需注意提取的限定关键字为前面以"省"开头、后面以"市"或"区"结束的中间字符,即是城市信息:

  • 计算平均薪资。由于这里的薪资字段其实还是比较规整的,即都是以K结尾(虽然可能有大小写之别),薪资上下限用-连接,所有其实有多种方法可以实现,这里举例其中的两种,其中第一种用到了字符串的切分函数,第二种方法仍然是正则匹配查找。两种方法均实现了两个数字的提取,进而可以完成上下限的均值计算。

  • 最后是提取下属信息,注意到这里的下属由一个字符串组成,且下属之间由空格间隔。针对这一需求,也可轻松实现两种解决方案,其中之一是进行拆分然后获取拆分后列表的长度、第二种是直接对字符串中空格进行计数,而后+1即为总的部下人数。两种方案结果是一致的:

以上,举了几个简单的例子对pandas中的字符串属性接口str进行了牛刀小试,其中包括python内置的字符串函数split、count、len等,也包括findallreplace中嵌套正则表达式等用法,灵活运用起来效率真的是可以起飞……

最后,给出str中的所有属性接口函数:

基本都是Python中常用的字符串函数,调用时只需在一个字符串列后调用str即可,方法简单,但效率却是异常明显的。

02 时间属性接口——dt

与str用法极其类似、对时间类型的数据处理极为友好的另一个属性接口是dt,即datetime的简称,要求适用于格式是时间类型的数据。由于时间类型在某些特定应用场景还是非常常用的,所以灵活运用dt属性接口也可实现非常便捷的数据处理操作。

这里首先仍然给出示例数据:

以上述时间序列数据为例,通过dt时间属性接口可以很容易的实现各类时间信息的提取,例如提取年份、日期和时间信息即可分别调用year、date和time属性即可。

这里需要注意的是,在前述str属性接口中,多数dt后面接的都是函数,而这里获取的year、date和time等都是属性(因为无需参数),二者的区别体现为函数以()结尾,而属性则无需括号。

但dt属性接口基本上都是这种属性接口,但也有一些是函数,例如指定类型的格式化

完整的接口清单如下:

基本上,时间格式中想得到的、想不到的基本都给予了实现,用来提取个时间信息简直是太方便了。

03 小结

一门编程语言中的基本数据类型无非就是数值型、字符串型、时间型以及布尔型,Pandas为了应对各种数据格式的向量化操作,针对字符串和时间格式数据专门提供了str和dt两个属性接口(数值型数据天然支持向量化操作,而布尔型也可通过位运算符&、|、~实现并行计算),通过调用属性接口后的系列方法,可以实现丰富的API以及高效的计算能力。尤其是字符串型数据,除了Python中通用的字符串方法外,还集成了正则表达式处理逻辑。

另外,除了str和dt两个属性接口外还有一个枚举属性接口cat(即category缩写),但实际上用处较为局限。

1近期文章 2 3 4 5 6 7 8 Python网络爬虫与文本数据分析 9 10 11 12 13 14 15 16 17 18 19 20 bsite库 | 采集B站视频信息、评论数据 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 爬虫实战 | 采集&可视化知乎问题的回答 37 38 39 40 41 42 43 44 45 46 47 48 pdf2docx库 | 转文件格式,支持抽取文件中的表格数据 49 50 51 52 53 54 55 56 57 58 59 60 rpy2库 | 在jupyter中调用R语言代码 61 62 63 64 65 66 67 68 69 70 71 72 tidytext | 耳目一新的R-style文本分析库 73 74 75 76 77 78 79 80 81 82 83 84 reticulate包 | 在Rmarkdown中调用Python代码 85 86 87 88 89 90 91 92 93 94 95 96 plydata库 | 数据操作管道操作符>> 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 plotnine: Python版的ggplot2作图库 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 七夕礼物 | 全网最火的钉子绕线图制作教程 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 读完本文你就了解什么是文本分析 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 文本分析在经管领域中的应用概述   161 162 163 164 165 166 167 168 169 170 171 172 综述:文本分析在市场营销研究中的应用 173 174 175 176 177 178 179 180 181 182 183 184 plotnine: Python版的ggplot2作图库 185 186 187 188 189 190 191 192 193 194 195 196 小案例: Pandas的apply方法 197 198 199 200    201 202 203 204 205 206 207 208 209 210 211 212 stylecloud:简洁易用的词云库 213 214 215 216   217 218 219 220 221 222 223 224 225 226 227 228 用Python绘制近20年地方财政收入变迁史视频 229 230 231 232    233 234 235 236 237 238 239 240 241 242 243 244 Wow~70G上市公司定期报告数据集 245 246 247 248 249 250 251 252 253 254 255 256 漂亮~pandas可以无缝衔接Bokeh   257 258 259 260 261 262 263 264 265 266 267 268 YelpDaset: 酒店管理类数据集10+G   269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296297 298 299 300 分享 301 302 303 304 ”和“ 305 306 307 308 在看 309 310 311 312 ”是更好的支持! 313 314 315 316 317 318 319 320 321 322 323 324

本文分享自微信公众号 - 大邓和他的Python(DaDengAndHisPython)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )