博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用 Pandas 将数据集中的某列文本拆分为多行
阅读量:7144 次
发布时间:2019-06-29

本文共 1698 字,大约阅读时间需要 5 分钟。

背景

手头的项目要求用 Tableau 创建一个 story,数据集是。其中有一个维度的数据处理起来有点棘手。

数据格式

注意 track 这个维度的数据,它表示的是在订单时间内的行车轨迹,里面包含了大量坐标点。

按照 tidydata 的要求:

  • Each variable forms a column.
  • Each observation forms a row.
  • Each type of observational unit forms a table.

我需要将 track 的坐标拆分为多行。

神来之笔

Google 了问题的解决方式,代码是

mobike.drop("track",axis = 1).join(mobike["track"].str.split("#",expand = True).stack().reset_index(level = 1,drop = True).rename("track"))

工作原理

解决问题不能光知其然,不知其所以然。所以我将这行代码逐语句进行了拆分,一探代码内部的工作原理。

最外层代码是:

mobike.join({dataset})

这里调用了 dataframe 的 join 方法,很基础。

{dataset} 这部分做的工作比较多,首先是 split 方法。Python 的 split 方法可以将字符串按照指定的字符进行分割,这个例子中指定的字符是「#」。如果不加参数 expand = Truesplit()会返回拆分后的字符串数组。

mobike["track"].str.split("#")# ["121.372,31.118","121.372,31.119","121.373,31.117","1...]# ["121.419,31.200","121.419,31.201","121.420,31.199","1...]# ...

加了 expand = True 会将数组拆开,数组中的每一个元素都会单独保存。

mobike["track"].str.split("#",expand = True)# "121.372,31.118" "121.372,31.119" "121.373,31.117" "1... # "121.419,31.200" "121.419,31.201" "121.420,31.199" "1...# ...

到这里相当于将列中所有文本拆成了一个巨大的表,表中每个单元格有一个值。有些行拆分后的元素比较少,没有值可以填充的单元格补充 None

stack() 会把整个表逐行堆叠成一列。

这样就成功的将一列中的所有文本拆分成了多行,而且它是一个 dataframe 。不过到这里还没有结束,我们还需要将拆出来的这个 dataframe 与原数据集合并。

注意到拆分出来的 dataframe 是多重索引的,需要用 reset_index() 将多重索引重置掉。在 split() 的时候,我们引入了超级多的 None。这时候就可以通过 reset_index(..., drop =True)将值为 None 的行删除。

与原数据集通过 join() 合并的时候,A.join(B),A、B两个 DataFrame 都需要有名字,因此需要 rename("track")

至此,我们的任务算做完了。

彩蛋

我在列拆分为多行的基础上,还将 track 拆分成了两个变量——track_x,track_y。这里用到了 pandas 的函数映射进行数据转换。

mobike["track" = mobike["track"].split(",")mobike["track_x"] = mobike["track"].map(lambda x:x[0])mobike["track_y"] = mobike["track"].map(lambda x:x[1])

通过 map 进行列的扩展速度非常非常快。

本文用到的摩拜数据及演示 notebook 均可在 下载。

转载地址:http://iswgl.baihongyu.com/

你可能感兴趣的文章
matlab中怎样加入凝视
查看>>
虚拟机 开发板 PC机 三者之间不能ping通的各种原因分析
查看>>
【Linux】Linux 目录结构
查看>>
001-权限原理基础知识
查看>>
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
查看>>
nod32的内网在线更新设置
查看>>
组网小常识
查看>>
再谈 apache设置virtualhost + apache的一些相关设值
查看>>
express框架
查看>>
Linux 上安装oracle客户端
查看>>
Objective-C多态:动态类型识别+动态绑定+动态加载
查看>>
select(Linux 编程)
查看>>
试读《你好哇,程序猿——漫话程序猿面试求职、升职加薪、创业与生活》
查看>>
Java生成读取条形码和二维码图片
查看>>
JMeter性能测试中控制业务比例
查看>>
[Android] SQLite数据库之增删改查基础操作
查看>>
面试题总结
查看>>
MySql常用 join 详解
查看>>
安装二维码、条形码识别工具zbar
查看>>
非“云”勿扰——情人节专场
查看>>