与this question相关,我一直试图使用melt,但没有成功。
我有一个1行的DataFrame,如下所示:
A B C total date A_size B_size C_size total_size
0 4 2 5 11 2019-01-01 123 456 789 1368我想把它变成这样(现在我不再关心date了):
Values Sizes
A 4 123
B 2 456
C 5 789
total 11 1368我有一些非常讨厌的东西做这项工作,但它不灵活。我希望能够添加D和D_size,而不必修改下游代码。
黑客代码:
def format_table(todays_metadata: pd.DataFrame):
todays_metadata_reformat = todays_metadata.loc[:, 'A':'total'] # hardcoded 'A'
todays_metadata_reformat.index = ['Values']
sizes = todays_metadata.loc[:, 'A_size':'total_size'] # hardcoded 'A_size'
sizes.index = ['Sizes']
sizes.columns = todays_metadata_reformat.columns
todays_metadata_reformat =
todays_metadata_reformat.append(sizes).transpose()
return todays_metadata_reformat发布于 2019-07-23 10:42:48
您可以通过total检查pd.Index.get_loc列的位置索引,并创建切片:
df1=df.drop('date',1)
i=df1.columns[:df1.columns.get_loc('total')+1] # ['A', 'B', 'C', 'total']
j=df1.columns[df1.columns.get_loc('total')+1:] #['A_size','B_size','C_size','total_size']然后融化和碰撞:
m=df1[j].melt(value_name='size')
m.index=m.pop('variable').str.split('_').str[0]
pd.concat([df1[i].melt().set_index('variable'),m],axis=1)编辑:
另一种使用df.filter()的方法
df1=df.drop('date',1)
m=df.filter(like='size')x=df1[df1.columns.difference(m.columns,sort=False)].melt().set_index('variable')
y=m.rename(columns=lambda x: x.split('_')[0]).melt(value_name='Sizes').set_index('variable')
print(pd.concat([x,y],axis=1)) value Sizes
variable
A 4 123
B 2 456
C 5 789
total 11 1368https://stackoverflow.com/questions/57162024
复制相似问题