如何根据熊猫中的行值创建新列

时间:2019-07-03 20:46:10

标签: python pandas

我有一个看起来像这样的数据框:

    time  speaker  label_1  label_2
0   0.25        1       10        4
1   0.25        2       10        5
2   0.50        1       10        6
3   0.50        2       10        7
4   0.75        1       10        8
5   0.75        2       10        9
6   1.00        1       10       11
7   1.00        2       10       12
8   1.25        1       11       13
9   1.25        2       11       14
10  1.50        1       11       15
11  1.50        2       11       16
12  1.75        1       11       17
13  1.75        2       11       18
14  2.00        1       11       19
15  2.00        2       11       20

“扬声器”列会产生1和2,以描绘给定时间戳记下的2位扬声器。我想从仅与一位发言人相关的'label_1'和'label_2'数据中创建新列。有关所需的输出,请参见下文。

 time  spk_1_label_1  spk_2_label1  spk_1_label_2  spk_2_label_2
   0.25        10         10             4               5
   0.50        10         10             6               7
   0.75        10         10             8               9
   1.00        10         10            11               12    
   1.25        11         11            13               14
   1.50        11         11            15               16
   1.75        11         11            17               18
   2.00        11         11            19               20

1 个答案:

答案 0 :(得分:5)

首先,我们使用pivot_table将行旋转到列。然后,我们通过将字符串与list_comprehensionf-string串联来创建所需的列名:

piv = df.pivot_table(index='time', columns='speaker')
piv.columns = [f'spk_{col[1]}_{col[0]}' for col in piv.columns]

      spk_1_label_1  spk_2_label_1  spk_1_label_2  spk_2_label_2
time                                                            
0.25             10             10              4              5
0.50             10             10              6              7
0.75             10             10              8              9
1.00             10             10             11             12
1.25             11             11             13             14
1.50             11             11             15             16
1.75             11             11             17             18
2.00             11             11             19             20

如果要删除索引名称:

piv.rename_axis(None, inplace=True)

      spk_1_label_1  spk_2_label_1  spk_1_label_2  spk_2_label_2
0.25             10             10              4              5
0.50             10             10              6              7
0.75             10             10              8              9
1.00             10             10             11             12
1.25             11             11             13             14
1.50             11             11             15             16
1.75             11             11             17             18
2.00             11             11             19             20

额外

如果需要,我们可以使用列名作为展平列的前缀来使其更通用:

piv.columns = [f'{piv.columns.names[1]}_{col[1]}_{col[0]}' for col in piv.columns]

      speaker_1_label_1  speaker_2_label_1  speaker_1_label_2  speaker_2_label_2
time                                                                            
0.25                 10                 10                  4                  5
0.50                 10                 10                  6                  7
0.75                 10                 10                  8                  9
1.00                 10                 10                 11                 12
1.25                 11                 11                 13                 14
1.50                 11                 11                 15                 16
1.75                 11                 11                 17                 18
2.00                 11                 11                 19                 20

通知:如果您的python版本<3.5,则不能使用f-strings,我们可以使用.format进行字符串格式化:

['spk_{}_{}'.format(col[0], col[1]) for col in piv.columns]