Python 如何将列的子元素拆分为单独的列和行元素?
我有如下数据帧。我需要把它们转换成下面的格式,如何做到这一点 输入 预期Ouptut 这在python中是如何实现的?由uuu首先用于新列,然后拆分服务,对于列表和使用,最后用于默认索引,使用drop=True: 由uu首先用于新列,然后拆分服务,对于列表和使用,最后用于默认索引,使用drop=True:Python 如何将列的子元素拆分为单独的列和行元素?,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,我有如下数据帧。我需要把它们转换成下面的格式,如何做到这一点 输入 预期Ouptut 这在python中是如何实现的?由uuu首先用于新列,然后拆分服务,对于列表和使用,最后用于默认索引,使用drop=True: 由uu首先用于新列,然后拆分服务,对于列表和使用,最后用于默认索引,使用drop=True: Customer Service A National_DOM_Express_S1,S2,S3 A National_DOM_ExpressPlus_
Customer Service
A National_DOM_Express_S1,S2,S3
A National_DOM_ExpressPlus_S1,S2,S3
B National_DOM_ExpressSvr_S1,S2
B National_DOM_Std_S1,S3
C Export_TB_Express_S1,S2,S3
Customer Type Market Product Service
A National DOM Express S1
A National DOM Express S2
A National DOM Express S3
A National DOM ExpressPlus S1
A National DOM ExpressPlus S2
A National DOM ExpressPlus S2
B National DOM ExpressSvr S1
B National DOM ExpressSvr S2
B National DOM Std S1
B National DOM Std S3
C Export TB Express S1
C Export TB Express S2
C Export TB Express S3
df[['Type','Market','Product','Service']] = df['Service'].str.split('_', expand=True)
df = (df.assign(Service = df.pop('Service').str.split(','))
.explode('Service')
.reset_index(drop=True))
print (df)
Customer Type Market Product Service
0 A National DOM Express S1
1 A National DOM Express S2
2 A National DOM Express S3
3 A National DOM ExpressPlus S1
4 A National DOM ExpressPlus S2
5 A National DOM ExpressPlus S3
6 B National DOM ExpressSvr S1
7 B National DOM ExpressSvr S2
8 B National DOM Std S1
9 B National DOM Std S3
10 C Export TB Express S1
11 C Export TB Express S2
12 C Export TB Express S3
#combine the two columns into one
res = (df.Customer.str.cat(df.Service,sep="_")
#split on combination of _ and ,
.str.split("[_,]",expand=True)
#set index on the first three columns
#these are the columns not containing S1, S2, ...
.set_index([0,1,2,3])
#stack and remove the last level as it is irrelevant
.stack()
.droplevel(-1)
)
#give the index names relevant to the final output
res.index = res.index.set_names(['Customer', 'Type', 'Market', 'Product'])
#reset index and give the final column a name as well
res.reset_index(name='Service')
Customer Type Market Product Service
0 A National DOM Express S1
1 A National DOM Express S2
2 A National DOM Express S3
3 A National DOM ExpressPlus S1
4 A National DOM ExpressPlus S2
5 A National DOM ExpressPlus S3
6 B National DOM ExpressSvr S1
7 B National DOM ExpressSvr S2
8 B National DOM Std S1
9 B National DOM Std S3
10 C Export TB Express S1
11 C Export TB Express S2
12 C Export TB Express S3