熊猫合并行/数据框转换

时间:2020-07-11 11:34:38

标签: python pandas dataframe

我有这个示例DataFrame:

e   col1    col2    col3
1   238.4   238.7   238.2
2   238.45  238.75  238.2
3   238.2   238.25  237.95
4   238.1   238.15  238.05
5   238.1   238.1   238
6   229.1   229.05  229.05
7   229.35  229.35  229.1
8   229.1   229.15  229
9   229.05  229.05  229

如何将其转换为此:

                1                      2            3   
    col1    col2    col3    col1    col2    col3    col1    col2    col3
1   238.4   238.7   238.2   238.45  238.75  238.2   238.2   238.25  237.95
2   238.1   238.15  238.05  238.1   238.1   238     229.1   229.05  229.05
3   229.35  229.35  229.1   229.1   229.15  229    229.05   229.05  229

我想也许我应该通过用镜头计数或分配可能是3的倍数的索引来进行旋转,但是我真的不确定哪种方法最有效。

3 个答案:

答案 0 :(得分:1)

创建一个分组序列g,这将需要对数据框进行分组,以便每个第三个元素(步长为3)属于同一组,使用np.unique获取唯一的分组键,接下来使用DataFrame.groupbyg上的数据帧进行分组,并使用set_index将每个分组帧的索引设置为k,最后使用pd.concat沿axis=1合并所有分组的数据帧,并传递可选参数keys=k以创建MultiLevel列 :

g, k = df.pop('e').sub(1) % 3 + 1, np.unique(g)
df1 = pd.concat([g.set_index(k) for _, g in df.groupby(g)], keys=k, axis=1)

详细信息:

print(g.tolist())
[1, 2, 3, 1, 2, 3, 1, 2, 3]

print(k)
array([1, 2, 3])

结果:

print(df1)

        1                       2                      3                
     col1    col2    col3    col1    col2   col3    col1    col2    col3
1  238.40  238.70  238.20  238.45  238.75  238.2  238.20  238.25  237.95
2  238.10  238.15  238.05  238.10  238.10  238.0  229.10  229.05  229.05
3  229.35  229.35  229.10  229.10  229.15  229.0  229.05  229.05  229.00

答案 1 :(得分:1)

数据以3步为单位进行整形,因此,我们必须以3步进行迭代,最后在列轴上进行串联:

pd.concat([df.iloc[n::3].
           reset_index(drop=True).
           set_index(pd.Index([index]*3), 
                     append = True)
           .unstack()
           .swaplevel(1,0, axis=1)
            for n, index in zip(range(0,df.shape[0]//df.shape[1]),
                                range(1, df.shape[1] + 1))], 
          axis = 1)

答案 2 :(得分:0)

使用熊猫方法和逐步方法:

df['id1'] = (df.e+2) % 3 + 1
df['id2'] = df['id1']
df.loc[df['id1']>1,'id2']=np.nan
df['id2'] = df['id2'].cumsum().ffill()
df2 = df.drop(columns='e').melt(id_vars = ['id1','id2'])

df3 = pd.pivot_table(df2, index = 'id2', columns = ['id1','variable'], values = 'value').reset_index(drop=True)
df3.index += 1
df3.columns.names = ['',''] 

结果:

        1                       2                      3                
     col1    col2    col3    col1    col2   col3    col1    col2    col3
1  238.40  238.70  238.20  238.45  238.75  238.2  238.20  238.25  237.95
2  238.10  238.15  238.05  238.10  238.10  238.0  229.10  229.05  229.05
3  229.35  229.35  229.10  229.10  229.15  229.0  229.05  229.05  229.00