python数据分析-分组把DataFrame列转行
问题:遇到了一个问题是需要根据DataFrame中的某一列把对应另一列的数据由列转为行。
一、数据展示
a = pd.DataFrame({'name1':['a','a','b','c','b','a','b','a','c','c'],'name2':['张三','张三','张三','李四','李四','李四','王五','王五','王五','王五']})
display(a)
目标样式:
二、解决思路
1、先计算出应该创建最长是多少列,比如举例数据a分组有4个元素b、c分组有三个元素,则按照最大的值创建列数然后不够长的分组用空值填充,并创建新的DataFrame为下面的循环准备。
group_name = 'name1' #用于分组的列名
trans_name = 'name2' #要变为横向的列名
#对要用于分组的数据做排序,目的是可以先查看数据
aa = aa.sort_values(by='%s' %group_name,ascending=True).reset_index(drop=True)
# 取出要转为行的列,并存为DF备用
bb = pd.DataFrame({group_name:aa[group_name],trans_name:aa[trans_name]})
cc = pd.DataFrame({group_name:aa[group_name],trans_name+'_count':aa[trans_name]})
#取出每个id应该被创建几次(即:应该创建的最长是几列)
ee = cc.groupby([group_name],sort=False,as_index=False).count()
a = list(ee[trans_name+'_count'])
#找出id重复最多的次数,即:应该创建多少列
b = a.copy()
b.sort()
print("最大元素为:", b[-1])
#创建准备接收排列数据的空数据框
dd = pd.DataFrame({group_name+'s':[]})
for i in range(1,b[-1]+1):dd[group_name+'s'+str(i)] = ''
print("dd的维度为:",dd.shape)
2、用循环循环按行取出每组中的元素并添加到空DataFrame中,然后每次做一个新的包含一行数据的DataFrame,把每次取出的数据合并,即可得到最后的按组转为行的数据。
#为上面取出来的数据按照最大的列数创建新的列
ii = 0
loc_num = 0
qqqq = pd.DataFrame({group_name+'s':[1]})
qqq = pd.DataFrame({group_name+'s':[1]})
while ii < len(a):ee = pd.DataFrame({group_name+'s':[1]})#先做的空数据框,是有两条空数据的,后面要把这两行删除qqq = pd.concat([qqq,qqqq],axis=0)#用切片循环取出要转为行的数据for i in range(1,a[ii]+1):ee[group_name+'s'+str(i)] = bb.loc[loc_num,trans_name]loc_num +=1 qqqq = pd.concat([dd,ee],axis=0)ii +=1
#合并每次取出的数据,组成新的数据框
qqqqq = pd.concat([qqq,qqqq],axis=0)
qqqqq = qqqqq.reset_index(drop=True)
#删除前面两行数据,因为前面是向含有一行数据的数据框中添加的每条的数据。
qqqqq.drop(labels=range(0,2),inplace=True) #按照索引删除行
qqqqq = qqqqq.reset_index(drop=True)
#####导出去重了的原始表的列,然后去重,用于添加qqq缺失的最后一行数据 #contract_codes
mm = cc.copy()
mm.drop_duplicates([group_name],keep='first',inplace=True)
mm = mm.reset_index(drop=True)
#用mm中的列替换qqqqq中的列,qqqqq就是最后处理完毕的数据
qqqqq[group_name+'s'] = mm[group_name]
print('程序已经执行结束')
3、完整的代码如下,工作中需要处理的数据6000+条,运行速度很快,不知道如果数据量非常大怎么样,后续有需要的话再优化代码,这次要求比较急,所以写的比较简单。
import pandas as pd
import numpy as np
import os
#等待处理的数据
aa = pd.DataFrame({'name1':['a','a','b','c','b','a','b','a','c','c'],'name2':['张三','张三','张三','李四','李四','李四','王五','王五','王五','王五'],'name3':[12,223,36,44,5,12,63,2,12,234]})
# aa = pd.read_excel(r'E:\\xxxxxxxxxxxxx\\xxxxxx\\xxxxxxx.xlsx')
group_name = 'name1' #用于分组的列名
trans_name = 'name2' #要变为横向的列名
#对要用于分组的数据做排序,目的是可以先查看数据
aa = aa.sort_values(by='%s' %group_name,ascending=True).reset_index(drop=True)
# 取出要转为行的列,并存为DF备用
bb = pd.DataFrame({group_name:aa[group_name],trans_name:aa[trans_name]})
cc = pd.DataFrame({group_name:aa[group_name],trans_name+'_count':aa[trans_name]})
#取出每个id应该被创建几次(即:应该创建的最长是几列)
ee = cc.groupby([group_name],sort=False,as_index=False).count()
a = list(ee[trans_name+'_count'])
#找出id重复最多的次数,即:应该创建多少列
b = a.copy()
b.sort()
print("最大元素为:", b[-1])
#创建准备接收排列数据的空数据框
dd = pd.DataFrame({group_name+'s':[]})
for i in range(1,b[-1]+1):dd[group_name+'s'+str(i)] = ''
print("dd的维度为:",dd.shape)
#为上面取出来的数据按照最大的列数创建新的列
ii = 0
loc_num = 0
qqqq = pd.DataFrame({group_name+'s':[1]})
qqq = pd.DataFrame({group_name+'s':[1]})
while ii < len(a):ee = pd.DataFrame({group_name+'s':[1]})#先做的空数据框,是有两条空数据的,后面要把这两行删除qqq = pd.concat([qqq,qqqq],axis=0)#用切片循环取出要转为行的数据for i in range(1,a[ii]+1):ee[group_name+'s'+str(i)] = bb.loc[loc_num,trans_name]loc_num +=1 qqqq = pd.concat([dd,ee],axis=0)ii +=1
#合并每次取出的数据,组成新的数据框
qqqqq = pd.concat([qqq,qqqq],axis=0)
qqqqq = qqqqq.reset_index(drop=True)
#删除前面两行数据,因为前面是向含有一行数据的数据框中添加的每条的数据。
qqqqq.drop(labels=range(0,2),inplace=True) #按照索引删除行
qqqqq = qqqqq.reset_index(drop=True)
#####导出去重了的原始表的列,然后去重,用于添加qqq缺失的最后一行数据 #contract_codes
mm = cc.copy()
mm.drop_duplicates([group_name],keep='first',inplace=True)
mm = mm.reset_index(drop=True)
#用mm中的列替换qqqqq中的列,qqqqq就是最后处理完毕的数据
qqqqq[group_name+'s'] = mm[group_name]
print('程序已经执行结束')
最后,如果大家有简单的方法欢迎交流。
python数据分析-分组把DataFrame列转行相关推荐
- Python数据分析实战-提取DataFrame(Excel)某列(字段)最全操作(附源码和实现效果)
实现功能: Python数据分析实战-提取DataFrame(Excel)某列(字段)最全操作,代码演示了单列提取和多列提取两种情况,其中单列提取有返回series格式和dataframe两种情况,在 ...
- Python数据分析pandas之dataframe初识
Python数据分析pandas之dataframe初识 声明与简介 pandas是一个基于python的.快速的.高效.灵活.易用的开源的数据处理.分析包(工具)..pandas构建在numpy之上 ...
- python对excel某一列去重-python中怎么对dataframe列去重
python中对已经生成的Series,怎样组合成DataFrame 如 a = Series([1,2,3]) b = Series([2,3,4]) 怎样将a b组合成一个DataFzip函数接受 ...
- ABP 多模块关联查询、分组统计、列转行、Vue 复合表头动态列
本文记录了一次使用abp Core5 ,vue 开发复杂报表的经历. 0.需求概述 业务需求是:统计一个化工厂车队形式记录数据中异常停车的报表,维度可以按照车俩.驾驶员两个维度进行统计,统计的元素有: ...
- 转行学python 数据分析统计服_25岁转行数据分析的学习计划
我在通讯电子行业工作了近三年,平时主要运营渠道客户.用EXCEL分析销售数据,PPT制作报告:初识数据分析,现在想想,还是在工作一年以后:当时突然接到一个紧急的业务,数十万条数据,需要对数据进行多次单 ...
- Python数据分析分组聚合重采样典型例题及其解法
快速浏览 文件下载链接(csv) 题目 本人代码 方法解释 运行结果 文件下载链接(csv) 文件下载 题目 Date表示价格调查的日期,AveragePrice表示当天的平均价格,region表示 ...
- python数据分析 pandas对某列Series调用有道翻译API进行翻译
需求:使用pandas对船舶数据分析中,爬取下来的一些字段是英文的,将某列Series的英文翻译成中文 解决方案:这里封装了一个对某列不同语言的Series进行翻译的类 思路:因为翻译接口有访问次数的 ...
- 将Excel文件导入到MySQL数据库中并实现列转行操作
在处理数据的时候,因为数据源在Excel文件中,本人Excel文件的处理方法不是太会,加上朋友说在Excel中处理这样的数据很麻烦,我就想着干脆导入到数据库中通过代码解决这个问题,感兴趣的可以找我拿数 ...
- 跟小白学Python数据分析——绘制仪表盘
本文继续采用PyEcharts v1.x版本进行绘制仪表盘. 注:PyEcharts分为 v0.5.x 和 v1.x 两个大版本,v0.5.x 和 v1.x 间不兼容,v0.5.x是基于Python2 ...
最新文章
- 如何在Go中编写防弹代码:不会失败的服务器工作流程
- JAVA常见字符编码表
- python美化excel_python3哪个库可以实现格式美化?
- 2022重庆大学877软件工程考研经验贴
- 【容器化部署简介】 基于腾讯云TKE: kubernetes(k8s), github actions, devops
- 姿态估计(人体关键点检测)之CPN
- “构建之法”--第三次作业:原型设计
- Hibernate【映射】知识要点
- Java方法和数组练习
- DNS工作原理及解析过程
- 看完这个,css中position的绝对定位相对定位就懂了
- LINUX - 实时LINUX内核(PREEMPT_RT)的编译安装以及测试
- 计算机版初中语文课文原文,初中语文课文蝉原文
- Windows遇到的图片查看问题。
- 029_《编程高手箴言》
- 读书笔记-人脉是设计出来的:关键篇
- 鸿蒙系统体验效果,搭载鸿蒙操作系统的智能家居,实现一键体验全场景效果
- C语言中实现四舍五入
- Mac电脑配置淘宝镜像
- 运营商大数据实时获客
热门文章
- svg html 鼠标滚轮交互,鼠标滚轮控制SVG线条动画
- html如何判断文本框是否为空,javascript如何判断输入框是否为空?
- iOS设置某个界面强制横屏,进入就横屏
- Java开发和测试开发两个岗位应该选哪个?
- 三星Galaxy note I9220 如何恢复出厂设置
- php 跳转回上一个页面,php跳转回上一个页面
- mt19937 随机数
- NTP时钟服务器(NTP网络时钟系统)配置说明方法
- python图片转手绘_在Mac上用python运行图片转手绘图的代码报错,请各位大佬帮忙。...
- 官宣,史上最全配色网站汇总