pandas一列拆分成多行
程序员文章站
2022-07-02 22:30:49
前言卸载 pandaspip uninstall pandas pip install pandas==0.25.3 -i https://pypi.tuna.tsinghua.edu.cn/simple some-packagedf.explode("")column : str or tuplereturn dataframe我们来看一下女生给我的文件是什么样子print(type(df['exp_job'][0]))df['exp_job']=df['exp_job'].m...
前言
冬日游,似水云雪落满头。
莫是谁家少年不知愁。
纵无心,跌入云泥,
相看笑不休!
好久没有女神的信,好久没有和她谈心,怀念她柔情似水的眼睛,是李有为加班夜晚中的星星……
女神失恋的第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
启示:多看官方文档,多看源代码,总能得到意想不到的收获。
当李有为把数据发送给女神时,女神不一会儿就给他送来了一杯温暖的奶茶,令女神意想不到的是,李有为这一次竟然破天荒的拒绝了她的好意,她向李有为询问原因。
李有为温言道:“我想问一下,爱奇艺会员,你有吗?”
李有为的这句话究竟有何深意,他与女神之间的故事有会有着怎样的进展,预知后事如何,请听下回分解。
本文地址:https://blog.csdn.net/katyusha1/article/details/110894874