首页 > 解决方案 > 重塑数据框切片列

问题描述

是否有任何有效的方法来重塑数据框:

(A1、A2、A3、B1、B2、B3、C1、C2、C3、TT、YY 和 ZZ 是列)

A1 A2 A3 B1 B2 B3 C1 C2 C3 TT YY ZZ
a1 a2 a3 b1 b2 b3 c1 c2 c3 11 12 13
a4 a5 a6 b4 b5 b6 c4 c5 c6 14 15 16
a7 a8 a9 b7 b8 b9 c7 c8 c9 17 18 19

HH JJ KK TT YY ZZ
a1 a2 a3 11 12 13
b1 b2 b3 11 12 13
c1 c2 c3 11 12 13
a4 a5 a6 14 15 16
b4 b5 b6 14 15 16
c4 c5 c6 14 15 16
a7 a8 a9 17 18 19
b7 b8 b9 17 18 19
c7 c8 c9 17 18 19

HH、JJ 和 KK 是新列 感谢您的帮助

标签: python-3.xpandas

解决方案


wide_to_long

d = pd.wide_to_long(df, ['A', 'B', 'C'], ['TT', 'YY', 'ZZ'], 'Obs')
d.reset_index([0, 1, 2]).reset_index(drop=True)

   TT  YY  ZZ   A   B   C
0  11  12  13  a1  b1  c1
1  11  12  13  a2  b2  c2
2  11  12  13  a3  b3  c3
3  14  15  16  a4  b4  c4
4  14  15  16  a5  b5  c5
5  14  15  16  a6  b6  c6
6  17  18  19  a7  b7  c7
7  17  18  19  a8  b8  c8
8  17  18  19  a9  b9  c9

更多细节

pd.wide_to_long(
    df,                   # Name of the dataframe (obviously)
    ['A', 'B', 'C'],      # Stubnames of columns to be folded
    ['TT', 'YY', 'ZZ'],   # Columns to broadcast
    'Obs'                 # Name of new column/index that shows observation
)

               A   B   C
TT YY ZZ Obs            
11 12 13 1    a1  b1  c1
         2    a2  b2  c2
         3    a3  b3  c3
14 15 16 1    a4  b4  c4
         2    a5  b5  c5
         3    a6  b6  c6
17 18 19 1    a7  b7  c7
         2    a8  b8  c8
         3    a9  b9  c9

麻木的

a = df.iloc[:, :-3].to_numpy()
b = df.iloc[:, -3:].to_numpy()

c = a.reshape(-1, 3)
k = c.shape[0] / a.shape[0]
d = b.repeat(k, axis=0)

pd.DataFrame(np.column_stack([c, d]), columns=['HH', 'JJ', 'KK', 'TT', 'YY', 'ZZ'])

   HH  JJ  KK  TT  YY  ZZ
0  a1  a2  a3  11  12  13
1  b1  b2  b3  11  12  13
2  c1  c2  c3  11  12  13
3  a4  a5  a6  14  15  16
4  b4  b5  b6  14  15  16
5  c4  c5  c6  14  15  16
6  a7  a8  a9  17  18  19
7  b7  b8  b9  17  18  19
8  c7  c8  c9  17  18  19

推荐阅读