The pandas.melt function的功能类似于您想要的:
pd.melt(df, id_vars=['weight'], value_vars=['a1_P', 'a2_P'], value_name='P')
weight variable P
0 14733.23 a1_P 33297.81
1 86954.04 a1_P 58895.18
2 14733.23 a2_P 17407.93
3 86954.04 a2_P 43013.57
当然,通过在melt语句的末尾附加.sort(‘P’)可以很容易地完成P的排序.
pd.melt(df, id_vars=['weight'], value_vars=['a1_P', 'a2_P'], value_name='P').sort('P')
weight variable P
2 14733.23 a2_P 17407.93
0 14733.23 a1_P 33297.81
3 86954.04 a2_P 43013.57
1 86954.04 a1_P 58895.18
如果您想超级动态,也许可以通过这种奇特的方式生成value_vars:
n_values = 2
value_vars = ["a{}_P".format(i+1) for i in range(0, n_values)]
pd.melt(df, id_vars=['weight'], value_vars=value_vars, value_name='P').sort('P')
若要使索引为[0、1、2、3 …],只需将.reset_index(drop = True)用作链接事件,或类似这样:
df = pd.melt(df, id_vars=['weight'], value_vars=value_vars, value_name='P')
df.sort(inplace=True)
df.reset_index(drop=True, inplace=True)
我个人更喜欢就地操作,因为它们的内存效率更高.