将行项目映射到另一个数据框的固定列集?

时间:2020-05-01 17:57:45

标签: python pandas

我一直在尝试将time的{​​{1}}和channel中的每个velocity映射到另一个数据帧。

例如: 我有一个这样的表格:

enter image description here

在此表中不可见,但是对于每个note,多个time都可以使用,例如(1、2,... 16)(每个{{1} }即channel对特定的time及其对应的channeltime值不重复。

由于通道仅在note的固定范围内。 因此,这将导致创建新数据帧的velocity个固定列,例如:

1 to 16

如果找不到特定列的值,请用32填充。

有没有办法用一种古怪的方式做到这一点?

1 个答案:

答案 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