欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

pandas一列拆分成多行

程序员文章站 2022-03-27 21:06:44
前言卸载 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天后,日渐消瘦的她终于从分手的阴霾中走了出来,身上散发着像往常耀眼夺目的光彩。

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

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

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

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

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

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

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

pandas一列拆分成多行
 女神的需求其实很简单,就是将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)

pandas一列拆分成多行

2、行转列

df_exp_job=df_exp_job.stack()

pandas一列拆分成多行

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

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

pandas一列拆分成多行

4、和原始数据合并

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

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

pandas一列拆分成多行

5、简单聚合

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

pandas一列拆分成多行

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

pandas一列拆分成多行
pandas一列拆分成多行

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

二:paddas explode

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

pandas一列拆分成多行

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

pandas一列拆分成多行
pandas一列拆分成多行

 这个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版本即可

卸载 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