我一直在尝试将time
的{{1}}和channel
中的每个velocity
映射到另一个数据帧。
例如: 我有一个这样的表格:
在此表中不可见,但是对于每个note
,多个time
都可以使用,例如(1、2,... 16)(每个{{1} }即channel
对特定的time
及其对应的channel
和time
值不重复。
由于通道仅在note
的固定范围内。
因此,这将导致创建新数据帧的velocity
个固定列,例如:
1 to 16
如果找不到特定列的值,请用32
填充。
有没有办法用一种古怪的方式做到这一点?
答案 0 :(得分:1)
尝试此MCVE:
import numpy as np
import pandas as pd
timelist = np.arange(1,21)
channels = [1,2,3,5]
df = pd.DataFrame({'notes':np.random.randint(100,200,80),
'velocity':np.random.randint(1000,9000, 80)},
index=pd.MultiIndex.from_product([timelist, channels]))
df = df.rename_axis(['Time', 'Channel'])
输入数据框:
notes velocity
Time Channel
1 1 199 7683
2 106 5981
3 111 8324
5 177 6123
2 1 113 6608
... ... ...
19 5 120 1779
20 1 149 7591
2 171 8513
3 128 1341
5 192 5942
[80 rows x 2 columns]
尝试将标头拆包和展平:
df_out = df.unstack().reindex(pd.MultiIndex.from_product([['notes','velocity'],
[1,2,3,4,5]]),
axis=1,
fill_value=0)
df_out.columns = [f'C{j} {i}' for i,j in df_out.columns]
df_out
输出:
C1 notes C2 notes C3 notes C4 notes C5 notes C1 velocity C2 velocity C3 velocity C4 velocity C5 velocity
Time
1 199 106 111 0 177 7683 5981 8324 0 6123
2 113 115 151 0 115 6608 3461 8315 0 1142
3 142 160 160 0 130 4394 7909 1738 0 1283
4 128 175 148 0 197 4002 4245 7066 0 1851
5 148 129 196 0 144 7755 3266 4123 0 6621