问题:遇到了一个问题是需要根据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列转行相关推荐

  1. Python数据分析实战-提取DataFrame(Excel)某列(字段)最全操作(附源码和实现效果)

    实现功能: Python数据分析实战-提取DataFrame(Excel)某列(字段)最全操作,代码演示了单列提取和多列提取两种情况,其中单列提取有返回series格式和dataframe两种情况,在 ...

  2. Python数据分析pandas之dataframe初识

    Python数据分析pandas之dataframe初识 声明与简介 pandas是一个基于python的.快速的.高效.灵活.易用的开源的数据处理.分析包(工具)..pandas构建在numpy之上 ...

  3. python对excel某一列去重-python中怎么对dataframe列去重

    python中对已经生成的Series,怎样组合成DataFrame 如 a = Series([1,2,3]) b = Series([2,3,4]) 怎样将a b组合成一个DataFzip函数接受 ...

  4. ABP 多模块关联查询、分组统计、列转行、Vue 复合表头动态列

    本文记录了一次使用abp Core5 ,vue 开发复杂报表的经历. 0.需求概述 业务需求是:统计一个化工厂车队形式记录数据中异常停车的报表,维度可以按照车俩.驾驶员两个维度进行统计,统计的元素有: ...

  5. 转行学python 数据分析统计服_25岁转行数据分析的学习计划

    我在通讯电子行业工作了近三年,平时主要运营渠道客户.用EXCEL分析销售数据,PPT制作报告:初识数据分析,现在想想,还是在工作一年以后:当时突然接到一个紧急的业务,数十万条数据,需要对数据进行多次单 ...

  6. Python数据分析分组聚合重采样典型例题及其解法

    快速浏览 文件下载链接(csv) 题目 本人代码 方法解释 运行结果 文件下载链接(csv) 文件下载 题目  Date表示价格调查的日期,AveragePrice表示当天的平均价格,region表示 ...

  7. python数据分析 pandas对某列Series调用有道翻译API进行翻译

    需求:使用pandas对船舶数据分析中,爬取下来的一些字段是英文的,将某列Series的英文翻译成中文 解决方案:这里封装了一个对某列不同语言的Series进行翻译的类 思路:因为翻译接口有访问次数的 ...

  8. 将Excel文件导入到MySQL数据库中并实现列转行操作

    在处理数据的时候,因为数据源在Excel文件中,本人Excel文件的处理方法不是太会,加上朋友说在Excel中处理这样的数据很麻烦,我就想着干脆导入到数据库中通过代码解决这个问题,感兴趣的可以找我拿数 ...

  9. 跟小白学Python数据分析——绘制仪表盘

    本文继续采用PyEcharts v1.x版本进行绘制仪表盘. 注:PyEcharts分为 v0.5.x 和 v1.x 两个大版本,v0.5.x 和 v1.x 间不兼容,v0.5.x是基于Python2 ...

最新文章

  1. 如何在Go中编写防弹代码:不会失败的服务器工作流程
  2. JAVA常见字符编码表
  3. python美化excel_python3哪个库可以实现格式美化?
  4. 2022重庆大学877软件工程考研经验贴
  5. 【容器化部署简介】 基于腾讯云TKE: kubernetes(k8s), github actions, devops
  6. 姿态估计(人体关键点检测)之CPN
  7. “构建之法”--第三次作业:原型设计
  8. Hibernate【映射】知识要点
  9. Java方法和数组练习
  10. DNS工作原理及解析过程
  11. 看完这个,css中position的绝对定位相对定位就懂了
  12. LINUX - 实时LINUX内核(PREEMPT_RT)的编译安装以及测试
  13. 计算机版初中语文课文原文,初中语文课文蝉原文
  14. Windows遇到的图片查看问题。
  15. 029_《编程高手箴言》
  16. 读书笔记-人脉是设计出来的:关键篇
  17. 鸿蒙系统体验效果,搭载鸿蒙操作系统的智能家居,实现一键体验全场景效果
  18. C语言中实现四舍五入
  19. Mac电脑配置淘宝镜像
  20. 运营商大数据实时获客

热门文章

  1. svg html 鼠标滚轮交互,鼠标滚轮控制SVG线条动画
  2. html如何判断文本框是否为空,javascript如何判断输入框是否为空?
  3. iOS设置某个界面强制横屏,进入就横屏
  4. Java开发和测试开发两个岗位应该选哪个?
  5. 三星Galaxy note I9220 如何恢复出厂设置
  6. php 跳转回上一个页面,php跳转回上一个页面
  7. mt19937 随机数
  8. NTP时钟服务器(NTP网络时钟系统)配置说明方法
  9. python图片转手绘_在Mac上用python运行图片转手绘图的代码报错,请各位大佬帮忙。...
  10. 官宣,史上最全配色网站汇总