pandas行列转换的3种操作
请访问: python666.cn

一、行转列:分组筛选拼接
问题(群成员"哎哟喂是豆子")
想要实现按名称分组,并将分组内的列向数据转为横向数据,字段按照分组内行排序顺序依次给定(如下图状态->状态1,状态2,状态3,状态4)。
解决方法
用法:groupby,concat
这里使用分组内聚合函数nth(n),可以提取组内的第n行数据。因此可以按行顺序依次提取出来,然后再横向拼接起来即为最后想要的结果。
num = df[df['名称']=='糖葫芦'].shape[0]grp_list = [df.groupby('名称')[['状态','编号']].nth(n).reset_index(drop=True) \
.rename(columns={'状态':'状态{}'.format(n+1),'编号':'编号{}'.format(n+1)}) \
for n in range(0,num)]
pd.concat(grp_list,axis=1)
二、列转行:字符拼接爆炸
问题(群成员"最会烤地瓜")
现在想要将以上得到的结果再还原回去,如何操作呢?
解决方法
用法:explode,concat,str.cat,str.split
列转行可以借助explode爆炸方法来解决。
但此时的数据已经是横向分散在各列上比如状态有4个字段,并不是explode可以接受的列表形式。因此我们这里需借助字符串拼接str.cat()的方法构造出两个辅助列,然后用split分割成列表,最后将explode的结果拼接起来即可还原。
df1['状态']=df1['状态1'].str.cat([df1['状态2'],df1['状态3'],df1['状态4']], sep=',')
df1['编号']=df1['编号1'].str.cat([df1['编号2'],df1['编号3'],df1['编号4']], sep=',')
pd.concat([df1['状态'].str.split(',').explode(),
df1['编号'].str.split(',').explode()],axis=1)
三、列转行:轴旋转+正则提取
问题(群成员"耿楠"):
请问如何能高效只提取数字到相应的工作表中?
解决方法
用法:from_product,stack,str.extract,droplevel,sort_values,reset_index
因为原数据有二级列索引,因此考虑用stack将列索引转为行索引,即实现逆透视。
然后使用正则表达式将数据中的数字提取出来,再进行排序调整。
df=pd.read_excel('./pandas进阶题库数据/数据形式变换-4星-3.xlsx',header=1,index_col=0)# 重新制定二级columns列索引
name = ['张芹', '杨涵', '李雪']
month = ['1月','2月','3月','4月']
mindex = pd.MultiIndex.from_product([name,month], names=['姓名',None])
df.columns = mindex
# 列columns转旋转成行index
df1 = df.stack(level=0)
df1 = df1.astype(str)
# 用str.extract正则提取括号内数字,也可以使用re正则模型
for col in df1.columns:
df1[col] = df1[col].str.extract(pat='\(([0-9]{1,}(?:\.[0-9]+)?)\)')
# 剔除无用索引,重新排序
df1.index = df1.index.droplevel(level=0)
df1.reset_index().sort_values(by='姓名',ascending=True).reset_index(drop=True)
作者:东哥起飞
本书从 Python 和 Excel 结合使用的角度讲解处理分析数据的思路、方法与实战应用。不论是希望从事数据分析岗位的学习者,还是其他职业的办公人员,都可以通过本书的学习掌握 Python 分析数据的技能。书中创新性地将 ChatGPT 引入到教学当中,用 ChatGPT 答疑并提供实训代码,并介绍了使用 ChatGPT 辅助学习的一些实用技巧,给学习者带来全新的学习方式。
读者朋友们购买后可在后台联系我,加入读者交流群,Crossin会为你开启陪读模式,解答你在阅读本书时的一切疑问。
_往期文章推荐_
【教程】: python