Skip to main content
 首页 » 编程设计

python之将行添加到 Pandas DataFrame 中的组

2025年05月04日14EasonJim

我有以下 Pandas DataFrame:

     start_timestamp_milli  end_timestamp_milli       name  rating 
1            1555414708025        1555414723279    Valence       2    
2            1555414708025        1555414723279    Arousal       6    
3            1555414708025        1555414723279  Dominance       2    
4            1555414708025        1555414723279    Sadness       1    
5            1555414813304        1555414831795    Valence       3    
6            1555414813304        1555414831795    Arousal       5    
7            1555414813304        1555414831795  Dominance       2    
8            1555414813304        1555414831795    Sadness       1    
9            1555414921819        1555414931382    Valence       1    
10           1555414921819        1555414931382    Arousal       7    
11           1555414921819        1555414931382  Dominance       2    
12           1555414921819        1555414931382    Sadness       1    
13           1555414921819        1555414931382      Anger       1  

在上面的示例中,有三个组可以按 start_timestamp_milli 和 end_timestamp_milli 进行分组。第一组从索引 1 到 4,第二组从索引 5 - 8,第三组从索引 9 到 13。

对于每个这样的组,如果名称列中不存在“愤怒”和“快乐”,我想将其插入评级为 0。如果存在,则不会发生任何事情。

最终结果应该是这样的。添加的行是第 5、6、11、12 和 18 行。

     start_timestamp_milli  end_timestamp_milli       name  rating 
1            1555414708025        1555414723279    Valence       2    
2            1555414708025        1555414723279    Arousal       6    
3            1555414708025        1555414723279  Dominance       2    
4            1555414708025        1555414723279    Sadness       1 
5            1555414708025        1555414723279    Happiness     0 
6            1555414708025        1555414723279    Anger         0 
7            1555414813304        1555414831795    Valence       3    
8            1555414813304        1555414831795    Arousal       5    
9            1555414813304        1555414831795  Dominance       2    
10           1555414813304        1555414831795    Sadness       1 
11           1555414813304        1555414831795    Happiness     0 
12           1555414813304        1555414831795    Anger         0    
13           1555414921819        1555414931382    Valence       1    
14           1555414921819        1555414931382    Arousal       7    
15           1555414921819        1555414931382  Dominance       2    
16           1555414921819        1555414931382    Sadness       1  
17           1555414921819        1555414931382   Happiness      0   
18           1555414921819        1555414931382      Anger       1  

如何做到这一点?

请您参考如下方法:

选项 1

这非常明确地遍历每个组并附加虚拟数据框并删除重复项。

d = dict(name=['Anger', 'Happiness'], rating=0) 
cols = ['start_timestamp_milli', 'end_timestamp_milli'] 
def f(d0, k): 
    d1 = pd.DataFrame({**dict(zip(cols, k)), **d}) 
    return d0.append(d1, ignore_index=True).drop_duplicates('name') 
 
pd.concat([f(d, k) for k, d in df.groupby(cols)], ignore_index=True) 
 
    start_timestamp_milli  end_timestamp_milli       name  rating 
0           1555414708025        1555414723279    Valence       2 
1           1555414708025        1555414723279    Arousal       6 
2           1555414708025        1555414723279  Dominance       2 
3           1555414708025        1555414723279    Sadness       1 
4           1555414708025        1555414723279      Anger       0 
5           1555414708025        1555414723279  Happiness       0 
6           1555414813304        1555414831795    Valence       3 
7           1555414813304        1555414831795    Arousal       5 
8           1555414813304        1555414831795  Dominance       2 
9           1555414813304        1555414831795    Sadness       1 
10          1555414813304        1555414831795      Anger       0 
11          1555414813304        1555414831795  Happiness       0 
12          1555414921819        1555414931382    Valence       1 
13          1555414921819        1555414931382    Arousal       7 
14          1555414921819        1555414931382  Dominance       2 
15          1555414921819        1555414931382    Sadness       1 
16          1555414921819        1555414931382      Anger       1 
17          1555414921819        1555414931382  Happiness       0 

选项 2

这将构建一个新索引并使用 reindex

cats = ['Anger', 'Happiness'] 
cols = ['start_timestamp_milli', 'end_timestamp_milli'] 
 
d = df.set_index([*cols, 'name']) 
i = pd.MultiIndex.from_tuples( 
    [(s, e, n) for s, e in {*zip(*map(df.get, cols))} for n in cats], 
    names=d.index.names 
) | d.index 
 
df.set_index([*cols, 'name']).reindex(i, fill_value=0).reset_index() 
 
    start_timestamp_milli  end_timestamp_milli       name  rating 
0           1555414708025        1555414723279      Anger       0 
1           1555414708025        1555414723279    Arousal       6 
2           1555414708025        1555414723279  Dominance       2 
3           1555414708025        1555414723279  Happiness       0 
4           1555414708025        1555414723279    Sadness       1 
5           1555414708025        1555414723279    Valence       2 
6           1555414813304        1555414831795      Anger       0 
7           1555414813304        1555414831795    Arousal       5 
8           1555414813304        1555414831795  Dominance       2 
9           1555414813304        1555414831795  Happiness       0 
10          1555414813304        1555414831795    Sadness       1 
11          1555414813304        1555414831795    Valence       3 
12          1555414921819        1555414931382      Anger       1 
13          1555414921819        1555414931382    Arousal       7 
14          1555414921819        1555414931382  Dominance       2 
15          1555414921819        1555414931382  Happiness       0 
16          1555414921819        1555414931382    Sadness       1 
17          1555414921819        1555414931382    Valence       1