我有一个形状为(16422,28)的2D数据框,如下所示:
df=
id var0 var1 var2 var3 var4 ... var27
5171 10.0 2.8 0.0 5.0 1.0 ... 9.4
5171 40.9 2.5 3.4 4.5 1.3 ... 7.7
5171 60.7 3.1 5.2 6.6 3.4 ... 1.0
...
5171 0.5 1.3 5.1 0.5 0.2 ... 0.4
4567 1.5 2.0 1.0 4.5 0.1 ... 0.4
4567 4.4 2.0 1.3 6.4 0.1 ... 3.3
4567 6.3 3.0 1.5 7.6 1.6 ... 1.6
...
4567 0.7 1.4 1.4 0.3 4.2 ... 1.7
...
9584 0.3 2.6 0.0 5.2 1.6 ... 9.7
9584 0.5 1.2 8.3 3.4 1.3 ... 1.7
9584 0.7 3.0 5.6 6.6 3.0 ... 1.0
...
9584 0.7 1.3 0.1 0.0 2.0 ... 1.7
我需要将其转换为形状为(16422,28,1)的3D数据框。以下将给我3D ndarray:
values_3d = df.values.reshape(df.shape[0], df.shape[1], 1)
我试图使用pd.Panel()将ndarray转换为3d数据帧:
tmp = pd.Panel(values_3d, major_axis=df.index, minor_axis=df.columns)
但是它抱怨TypeError: Panel() takes no argument
。然后我尝试创建具有多级索引的3D数据框,如下所示:
tmp = pd.DataFrame(values_3d, columns=df.columns
, index=pd.MultiIndex.from_product(np.arange(start=0, stop=values_3d.shape[0]), df.index))
它给了我这个错误:TypeError: Input must be list-like
我该如何重塑?
答案 0 :(得分:0)
np.random.seed([3, 1415])
data_2d = np.random.randint(10, size=(10, 5))
df_2d = pd.DataFrame(data_2d).add_prefix('var')
df_2d
var0 var1 var2 var3 var4
0 0 2 7 3 8
1 7 0 6 8 6
2 0 2 0 4 9
3 7 3 2 4 3
4 3 6 7 7 4
5 5 3 7 5 9
6 8 7 6 4 7
7 6 2 6 6 5
8 2 8 7 5 8
9 4 7 6 1 5
pd.concat
您似乎要添加长度为1的尺寸。
沿axis=0
:
# This will be the index label
# ↓
pd.concat({'label': df_2d})
var0 var1 var2 var3 var4
label 0 0 2 7 3 8
1 7 0 6 8 6
2 0 2 0 4 9
3 7 3 2 4 3
4 3 6 7 7 4
5 5 3 7 5 9
6 8 7 6 4 7
7 6 2 6 6 5
8 2 8 7 5 8
9 4 7 6 1 5
您可以标记新的索引级别
# This is the name of the index level
# This will be the index label │
# ↓ ↓
pd.concat({'label': df_2d}, names=['name_of_level'])
var0 var1 var2 var3 var4
name_of_level
label 0 0 2 7 3 8
1 7 0 6 8 6
2 0 2 0 4 9
3 7 3 2 4 3
4 3 6 7 7 4
5 5 3 7 5 9
6 8 7 6 4 7
7 6 2 6 6 5
8 2 8 7 5 8
9 4 7 6 1 5
沿axis=1
# This will be the index label
# ↓
pd.concat({'label': df_2d}, axis=1)
label
var0 var1 var2 var3 var4
0 0 2 7 3 8
1 7 0 6 8 6
2 0 2 0 4 9
3 7 3 2 4 3
4 3 6 7 7 4
5 5 3 7 5 9
6 8 7 6 4 7
7 6 2 6 6 5
8 2 8 7 5 8
9 4 7 6 1 5