pandas一列拆分成多行

前言

冬日游,似水云雪落满头。
莫是谁家少年不知愁。
纵无心,跌入云泥,
相看笑不休!

好久没有女神的信,好久没有和她谈心,怀念她柔情似水的眼睛,是李有为加班夜晚中的星星……

 女神失恋的第33天后,日渐消瘦的她终于从分手的阴霾中走了出来,身上散发着像往常耀眼夺目的光彩。

 “有为,你现在在工位上吗?”
 很快啊,看见了女神发来的消息,啪,李有为立马就点进了聊天窗口。

 “嗯”,以彼之道还施彼身,李有为简单回复了一个像女神往常一样回复他的字眼。

 很快啊,女神突然就来到了他的工位,眼眶里莹莹泛着泪花,一见面就劈头一句:“等闲变却故人心,却道故人心易变。有为,你可不可以不要这么高冷!”

 “气壮山河英雄泪,曲折缠绵儿女情。铁骨男儿担大道,最难消受美人恩。”

 李有为被女神这么一说,一下就云里雾里了,稀里糊涂就莫名其妙接了一个小需求,终究李有为还是又做了一次二十多岁的老实人。

 话说公司领导最近读了一些莫名其妙的书籍,开始提倡数据化治理,要求各个部门都该具有相关的数据思维,这样才不会被大数据时代淘汰。一时之间,公司上下,人人口中都挂着数据、图表、分析这些高大上的关键词语。

 李有为的女神自然也是其中的一员。这次她找到李有为是因为想做一个炫酷的词云图,然后再来一波很骚的数据分析,然而万事开头难,女神直接倒在了第一步数据预处理阶段。

在这里插入图片描述
 女神的需求其实很简单,就是将exp_job字段的期望岗位打散,然后求和计数,最后就可以制作岗位的词云图了。

李有为一看,立马就知道这个问题应该怎么解决了。

一:老方法(新方法可以直接看二)

1、去除多余的字符,然后分割列

df = pd.read_csv("test.csv",encoding="gbk")
df_exp_job = df['exp_job'].map(lambda x:x.replace("[","").replace("]","").replace('"',"")) \
			.str.split(',', expand=True)

在这里插入图片描述

2、行转列

df_exp_job=df_exp_job.stack()

在这里插入图片描述

3、重置索引,将新生成的index,重置到原来的索引上,并为字段命名

df_exp_job = df_exp_job.reset_index(level=1, drop=True).rename('exp_job')

在这里插入图片描述

4、和原始数据合并

&emps;利用两个数据index索引进行合并,并将原始dataframe的exp_job删除

df = df.drop(['exp_job'], axis=1).join(df_exp_job)

在这里插入图片描述

5、简单聚合

res=df.groupby(['exp_job']).count().reset_index()
print(res)

在这里插入图片描述

  大功告成,但是使用过在spark使用过强大的explode打散方法后,李有为想了想,pandas肯定也有类似的方法,于是搜索了一下 pandas explode

在这里插入图片描述
在这里插入图片描述

 好家伙,官方文档果然有同样的方法。照着官方文档的例子,李有为直接开始了自己的代码改造之旅。

二:paddas explode

import pandas as pd
df = pd.read_csv("test.csv",encoding="gbk")
df=df.explode("exp_job")
print(df)
 一通操作猛如虎,最后发现结果没有改变,李有为瞬间傻眼了,幸好女神不在身边,不然就糗大了。

在这里插入图片描述

 深吸一口气,李有为看了看官方文档,和源码

在这里插入图片描述
在这里插入图片描述

 这个explode方法其实就是对李有为方法一的更好的一种封装,他columns参数的数据类型必须是str或者tuple(list也可,str不会被分割打散)
#看一下自己的数据类型
import pandas as pd
import json
df = pd.read_csv("test.csv",encoding="gbk")
df=df.explode("exp_job")
print(type(df['exp_job'][0]))
#<class 'str'>
#结果很显然是字符串类型,所以需要对字符串做处理
#鉴于女神给的数据已经很像python中的list类型了,只需要做稍加的处理,使用json模块将字符串转换成list就可以了
 最终代码如下,很简单,有木有,很粗暴,有没有。
import pandas as pd
import json

df = pd.read_csv("test.csv",encoding="gbk")

df['exp_job']=df['exp_job'].map(lambda x:json.loads(x))

res=df.explode("exp_job").groupby(['exp_job']).count().reset_index().rename(columns={"name":"num"})

print(res)

在这里插入图片描述

注意:部分老铁运行可能会报错,那是因为pandas的版本过于老旧,重新升级pandas版本即可

卸载 pandas
pip uninstall pandas 
pip install   pandas==0.25.3  -i https://pypi.tuna.tsinghua.edu.cn/simple some-package

启示:多看官方文档,多看源代码,总能得到意想不到的收获。

 当李有为把数据发送给女神时,女神不一会儿就给他送来了一杯温暖的奶茶,令女神意想不到的是,李有为这一次竟然破天荒的拒绝了她的好意,她向李有为询问原因。
李有为温言道:“我想问一下,爱奇艺会员,你有吗?”

 李有为的这句话究竟有何深意,他与女神之间的故事有会有着怎样的进展,预知后事如何,请听下回分解。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值