我有这个示例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的倍数的索引来进行旋转,但是我真的不确定哪种方法最有效。
答案 0 :(得分: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 :(得分: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