Skip to main content
 首页 » 编程设计

python之如何根据 Pandas 中的行值创建新列

2025年05月04日22kuangbin

我有一个如下所示的数据框:

    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 

“speaker”列产生 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 
 

请您参考如下方法:

首先,我们使用 pivot_table 将我们的行转换为列。然后我们通过字符串连接 list_comprehension 和 f-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]