如何将熊猫列动态转换为行

我在熊猫中有以下数据框


code   tank  noz_sale_cumsum  noz_1_sub  noz_2_sub   noz_1_avg   noz_2_avg  noz_1_flag  noz_2_flag 

123    1     1234             12         23          23.23       32.45      short       ok                

123    2     1200             13         53          33.13       22.45      excess      ok            

例如noz_1_sub, noz_2_sub, noz_1_avg, noz_2_avg, noz_1_flag and noz_2_flag动态生成的列。我想要的数据框将跟随。


code  tank  noz_no   noz_sale_cumsum  noz_sub   noz_avg   noz_flag

123   1     1        1234             12        23.23     short

123   1     2        1234             23        32.45     ok

123   2     1        1200             13        33.13     excess

123   2     2        1200             53        22.45     ok

我正在关注熊猫。


first I am getting all dynamic columns in different arrays


cols_sub = [cols for cols in df.columns if re.search('noz_\d+_sub', cols)]

cols_avg = [cols for cols in df.columns if re.search('noz_\d+_avg', cols)]

cols_flag = [cols for cols in df.columns if re.search('noz_\d+_flag', cols)]


final_df = df.pivot_table(index=['code', 'tank', 'noz_sale_cumsum'], columns=[cols_sub, cols_avg, cols_flag], values=[]).reset_index()      

我不确定值列以及如何从noz类似列中提取数字并将其放在noz_no列下。任何帮助表示赞赏。


慕姐8265434
浏览 115回答 1
1回答

德玛西亚99

您可以使用melt将所有内容转换为行,然后用于pivot_table将某些行转换回列。a = df.melt(id_vars=['code', 'tank', 'noz_sale_cumsum'])a['noz_no'] = a.variable.map(lambda x: x.split('_')[1])a['kpi'] = a.variable.map(lambda x: 'noz_' + x.split('_')[2])a.pivot_table(    values='value',    index=['code', 'tank', 'noz_sale_cumsum', 'noz_no'],    columns=['kpi'], aggfunc='first').reset_index()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python