合并行/数据帧转换

2024-05-20 09:10:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧示例:

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的倍数,但我真的不确定什么是最有效的方法


Tags: 数据方法示例col2col3col1镜头计数
3条回答

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

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

创建一个分组序列g,我们需要对数据帧进行分组,以便每三个元素(步长为3)都属于同一个组,使用^{}获取唯一的分组键,接下来使用^{}g上的数据帧进行分组,并使用set_index将每个分组帧的索引设置为k,最后使用^{}沿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

数据以三个步骤形成,因此,我们必须以三个步骤进行迭代,最后在列轴上连接:

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)

相关问题 更多 >