那天也是在某个公司进行了面试,面试官出了一个题:
将下面的这个表格的数据进行转化
转变形式为这种:
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')
读取的数据样子就是第一张图,然后出图的效果就是第二张图。
自己觉得这个办法应该还是挺快的,但是没有找数据去实践。
如果有更好的办法,可以交流交流!