Pandas合并行/数据框转换

3

我有一个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个回答

1
创建一个分组系列g,我们需要将数据框分组,使得每个第三个元素(步长为3)属于同一组,请使用np.unique获取唯一的分组键,接下来使用DataFrame.groupby对数据框进行分组,以g为依据,并使用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
数据按照三个步骤进行整理,因此我们必须按照这些步骤进行迭代,最后在列轴上进行连接。
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)

0
使用 Pandas 方法和逐步方法:
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接