Pandas Dataframe 中数据的分组和重排序

l7wslrjt  于 2023-02-27  发布在  其他
关注(0)|答案(1)|浏览(120)

我有一个 Dataframe

Candidate   z0, 0deg    z0, 30deg   z0, 60deg   z0, 90deg   z0, 120deg  z0, 150deg  z0, 180deg  z0, 210deg  z0, 240deg  
10006A  0.30    0.05    0.05    0.05    0.05    0.30    0.05    0.05    0.05
10008A  0.30    0.30    0.30    0.30    0.30    0.30    0.30    0.05    0.05

我想做的是重新构造 Dataframe ,使其如下所示

Candidate   angle   z0
10006A      0       0.30    
10006A      30      0.05    
10006A      60      0.05    
10006A      90      0.05    
10006A      120     0.05    
10006A      150     0.30    
10006A      180     0.05    
10006A      210     0.05    
10006A      240     0.05
10008A      0       0.30
...

我完全不知道如何做到这一点。Angular 可以从列名中检索到,但无论如何都是以30度的步长从0到330排序的。
这在Pandas身上能做到吗?

7hiiyaii

7hiiyaii1#

您应该能够使用带有一些后处理的wide_to_long

out = (pd.wide_to_long(df, stubnames=['z0'], i='Candidate', j='angle',
                       sep=', ', suffix='\d+deg')
         .reset_index()
         .assign(angle=lambda d: d['angle'].str.removesuffix('deg').astype(int))
      )

输出:

Candidate  angle    z0
0     10006A      0  0.30
1     10008A      0  0.30
2     10006A     30  0.05
3     10008A     30  0.30
4     10006A     60  0.05
5     10008A     60  0.30
6     10006A     90  0.05
7     10008A     90  0.30
8     10006A    120  0.05
9     10008A    120  0.30
10    10006A    150  0.30
11    10008A    150  0.30
12    10006A    180  0.05
13    10008A    180  0.30
14    10006A    210  0.05
15    10008A    210  0.05
16    10006A    240  0.05
17    10008A    240  0.05

使用更多stubnames

df = pd.DataFrame({'Candidate': ['10006A', '10008A'],
                   'z0, 0deg': [0.3, 0.3], 'z0, 30deg': [0.05, 0.3], 'z0, 60deg': [0.05, 0.3], 'z0, 90deg': [0.05, 0.3], 'z0, 120deg': [0.05, 0.3], 'z0, 150deg': [0.3, 0.3], 'z0, 180deg': [0.05, 0.3], 'z0, 210deg': [0.05, 0.05], 'z0, 240deg': [0.05, 0.05],
                   'c0, 0deg': [0.3, 0.3], 'c0, 30deg': [0.05, 0.3], 'c0, 60deg': [0.05, 0.3], 'c0, 90deg': [0.05, 0.3], 'c0, 120deg': [0.05, 0.3], 'c0, 150deg': [0.3, 0.3], 'c0, 180deg': [0.05, 0.3], 'c0, 210deg': [0.05, 0.05], 'c0, 240deg': [0.05, 0.05],
                   'vb0, 0deg': [0.3, 0.3], 'vb0, 30deg': [0.05, 0.3], 'vb0, 60deg': [0.05, 0.3], 'vb0, 90deg': [0.05, 0.3], 'vb0, 120deg': [0.05, 0.3], 'vb0, 150deg': [0.3, 0.3], 'vb0, 180deg': [0.05, 0.3], 'vb0, 210deg': [0.05, 0.05], 'vb0, 240deg': [0.05, 0.05],
                  })

out = (pd.wide_to_long(df, stubnames=['z0', 'c0', 'vb0'], i='Candidate', j='angle', sep=', ', suffix='\d+deg').reset_index()
         .assign(angle=lambda d: d['angle'].str.removesuffix('deg').astype(int))
      )

输出:

Candidate  angle    z0    c0   vb0
0     10006A      0  0.30  0.30  0.30
1     10008A      0  0.30  0.30  0.30
2     10006A     30  0.05  0.05  0.05
3     10008A     30  0.30  0.30  0.30
4     10006A     60  0.05  0.05  0.05
5     10008A     60  0.30  0.30  0.30
6     10006A     90  0.05  0.05  0.05
7     10008A     90  0.30  0.30  0.30
8     10006A    120  0.05  0.05  0.05
9     10008A    120  0.30  0.30  0.30
10    10006A    150  0.30  0.30  0.30
11    10008A    150  0.30  0.30  0.30
12    10006A    180  0.05  0.05  0.05
13    10008A    180  0.30  0.30  0.30
14    10006A    210  0.05  0.05  0.05
15    10008A    210  0.05  0.05  0.05
16    10006A    240  0.05  0.05  0.05
17    10008A    240  0.05  0.05  0.05

相关问题