请帮忙!
一共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 |
+----+-------------+-----+
Run Code Online (Sandbox Code Playgroud)
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 |
+----+-------------+-----+
Run Code Online (Sandbox Code Playgroud)
你可以这样做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')
)
Run Code Online (Sandbox Code Playgroud)
输出:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
40 次 |
| 最近记录: |