Skip to main content
 首页 » 编程设计

python之Pandas :根据组聚合添加新行

2025年05月04日10freeliver54

请帮忙!

一共有5种拒绝代码:EL1、EL2、EL3、EL4、EL5。我想追加新行,以便每个 ID 始终有 5 个拒绝代码。

这是我的原始DF:

+----+-------------+-----+ 
| ID | Reject Code | QTY | 
+----+-------------+-----+ 
| A  | EL1         |   7 | 
| A  | EL2         |   2 | 
| A  | EL3         |  33 | 
| B  | EL1         |   7 | 
| B  | EL2         |   1 | 
| B  | EL3         |   7 | 
| B  | EL4         |  36 | 
| B  | EL5         |   5 | 
| C  | EL1         |   3 | 
| C  | EL2         |  32 | 
+----+-------------+-----+ 

ID B 包含所有拒绝代码,因此我们不需要向其添加任何行。

ID A只有EL1、EL2和EL3,那么如何追加2行并将EL4和EL5设置为0 QTY?

和ID C一样,需要追加3行,EL3,EL4,EL5?

我想输出为:

+----+-------------+-----+ 
| ID | Reject Code | QTY | 
+----+-------------+-----+ 
| A  | EL1         |   7 | 
| A  | EL2         |   2 | 
| A  | EL3         |  33 | 
| A  | EL4         |   0 | 
| A  | EL5         |   0 | 
| B  | EL1         |   7 | 
| B  | EL2         |   1 | 
| B  | EL3         |   7 | 
| B  | EL4         |  36 | 
| B  | EL5         |   5 | 
| C  | EL1         |   3 | 
| C  | EL2         |  32 | 
| C  | EL3         |   0 | 
| C  | EL4         |   0 | 
| C  | EL5         |   0 | 
+----+-------------+-----+ 

请您参考如下方法:

你可以做pivot_table,然后melt/stack:

# all reject codes 
Rej_Codes = [f'EL{i+1}' for i in range(5)] 
 
(df.pivot_table(index='ID',  
               columns='Reject Code',  
               values='QTY',  
               fill_value=0) 
   .reindex(Rej_Codes, axis=1, fill_value=0) # as pointed out by rafaelc 
   .stack() 
   .reset_index(name='QTY') 
) 

输出:

   ID Reject Code  QTY 
0   A         EL1    7 
1   A         EL2    2 
2   A         EL3   33 
3   A         EL4    0 
4   A         EL5    0 
5   B         EL1    7 
6   B         EL2    1 
7   B         EL3    7 
8   B         EL4   36 
9   B         EL5    5 
10  C         EL1    3 
11  C         EL2   32 
12  C         EL3    0 
13  C         EL4    0 
14  C         EL5    0