将多个DataFrame列合并为一个

时间:2015-08-10 11:20:57

标签: python pandas

我尝试使用动态数量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"]]

然后对它进行排序,但这不起作用,因为我想这些列名不相同。

2 个答案:

答案 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

存在性能优化的空间,但它应该比具有显式循环的解决方案更快。