我尝试使用动态数量a_P
列来转换数据框,如下所示
a1_P a2_P weight
0 33297.81 17407.93 14733.23
1 58895.18 43013.57 86954.04
进入一个新的DataFrame,看起来像这样(按P排序)
P weight
0 17407.93 14733.23
1 33297.81 14733.23
2 43013.57 86954.04
3 58895.18 86954.04
所以我到目前为止所尝试的是
names = ["a1", "a2"]
p = pd.DataFrame(columns=["P", "weight"])
for i in range(0, len(names)):
p += df[["{}_P".format(names[i]), "weight"]]
然后对它进行排序,但这不起作用,因为我想这些列名不相同。
答案 0 :(得分:3)
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
当然,通过在{= 1}}附加P
来轻松完成.sort('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)
我个人更喜欢现场操作,因为它们的内存效率更高。
答案 1 :(得分:1)
使用Pandas {
...,
"aggregations" : {
"grades_stats" : {
"stats" : {
"script" : "_score"
}
}
}
}
(http://pandas.pydata.org/pandas-docs/stable/merging.html)的可能解决方案:
concat
存在性能优化的空间,但它应该比具有显式循环的解决方案更快。