我在下面的数据框中有发票数据。我想根据以下逻辑添加MainCode。
1-第一个分组依据ticket_id
和id
。如果level
为零,则MainCode应该为零。如果不是code
中的level
,则应采用零。
+-----------+----+-------+------+
| ticket_id | id | level | code |
+-----------+----+-------+------+
| 1 | 0 | 0 | 1710 |
| 1 | 0 | 1 | 372 |
| 1 | 0 | 2 | 607 |
| 1 | 1 | 0 | 1727 |
| 1 | 1 | 1 | 370 |
| 1 | 1 | 2 | 607 |
| 2 | 0 | 0 | 269 |
| 2 | 0 | 1 | 371 |
| 2 | 0 | 2 | 607 |
| 2 | 1 | 0 | 277 |
| 2 | 1 | 1 | 371 |
| 2 | 1 | 2 | 607 |
+-----------+----+-------+------+
到目前为止,我已经编写了以下代码
df.groupby(['ticket_id','id'])['code'].transform(lambda x: if df['level'] == 0, 0, df['code'])
。
但是我无法得到正确的输出。
我想要的输出如下
+-----------+----+-------+------+----------+
| ticket_id | id | level | code | MainCode |
+-----------+----+-------+------+----------+
| 1 | 0 | 0 | 1710 | 0 |
| 1 | 0 | 1 | 372 | 1710 |
| 1 | 0 | 2 | 607 | 1710 |
| 1 | 1 | 0 | 1727 | 0 |
| 1 | 1 | 1 | 370 | 1727 |
| 1 | 1 | 2 | 607 | 1727 |
| 2 | 0 | 0 | 269 | 0 |
| 2 | 0 | 1 | 371 | 269 |
| 2 | 0 | 2 | 607 | 269 |
| 2 | 1 | 0 | 277 | 0 |
| 2 | 1 | 1 | 371 | 277 |
| 2 | 1 | 2 | 607 | 277 |
+-----------+----+-------+------+----------+
请指导我解决这个问题
答案 0 :(得分:2)
您可以检查level
中哪些值与0
不同,然后将布尔结果与相应组的第一个值相乘,该值可以取groupby.transform
并与first
:
df['MainCode'] = (df.level.ne(0)
.mul(df.groupby(['ticket_id','id']).code
.transform('first')))
ticket_id id level code MainCode
0 1 0 0 1710 0
1 1 0 1 372 1710
2 1 0 2 607 1710
3 1 1 0 1727 0
4 1 1 1 370 1727
5 1 1 2 607 1727
6 2 0 0 269 0
7 2 0 1 371 269
8 2 0 2 607 269
9 2 1 0 277 0
10 2 1 1 371 277
11 2 1 2 607 277