Python将纵向数据进行分组之后横向转化

那天也是在某个公司进行了面试,面试官出了一个题:
将下面的这个表格的数据进行转化
图片1
转变形式为这种:
图片2
OK,我承认,我当时感觉特别的紧张,直接不知道代码怎么去写。
面试的时候我还是想了一种方法,我说我会新建两个字典来分别存储brand和product的数据,之后再依次添加到后面去。
但是面试官就说,嗯~那么如果数据量有一百万呢?
好吧,如果是百万数据,那运算的速度就肯定特别慢了。于是,我没想出来。

自己后来想了一下,想到了SQL里面的group_concat,我就想可以先用SQL来调整数据的形状,再用python去实现。

嗯~既然SQL能够实现,那么Python必定能够实现才是。于是乎:Python

import pandas as pd
import numpy as np

# 这个函数是用来添加新的列的
def labelname(label):
    ls=[]
    for i in range(ser_max[label]):
        ls.append(label+str(i+1))
    return ls

# 这个函数是用来获得某个分类的
def to_frame(label):
    df = ser[label].apply(lambda x :','.join(x)).to_frame()
    return df

if __name__=='__main__':
	
	#读取数据,基本工作准备
    a=pd.read_excel('a.xlsx')
    ser = a.groupby(['id','age'])
    ser_max = ser.count().max()
    label_lst = a.columns[2:]

	#将groupby后的组内数据展示出来
    df=pd.DataFrame()
    for i in label_lst:
        df_t=to_frame(i)
        df=pd.concat([df,df_t],axis=1)
    df.reset_index(inplace=True)
	
	#将组内数据再次分开
    for i in label_lst:
        df_n=df[i].str.split(r',',expand=True)
        df=pd.concat([df,df_n],axis=1)
    df.drop(label_lst,axis=1,inplace=True)

	#df的重命名	
    col_name=[]
    for i in label_lst:
        col_name=col_name+labelname(i)
    col_name = list(a.columns[0:2])+col_name
    df.columns=col_name

    df.to_excel('result.xlsx')

读取的数据样子就是第一张图,然后出图的效果就是第二张图。
自己觉得这个办法应该还是挺快的,但是没有找数据去实践。

如果有更好的办法,可以交流交流!

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值