Skip to main content
 首页 » 编程设计

python之强制所有行在条件后取值

2025年05月04日15java哥

我正在处理一个中型数据框并进行了大量数据操作,我最终得到以下数据框:

        id_1   id_2  flag_1  flag_2  flag_3 
0       000d  5d238       0       0       0 
1       001v  5cdd4       0       0       0 
2       001v  5d36e       1       1       1 
3       001v  5d53c       1       1       1 
4       001c  5cc1a       1       0       0 
...      ...    ...     ...     ...     ... 
124809  003n  5d89f       0       0       0 
124810  003n  5d8a6       1       0       0 
124811  003n  5d8b1       1       1       0 
124812  003n  5d8b3       1       1       1 
124813  003n  5d8cc       1       1       1 

这是您可以用来重新创建数据框的代码:

import pandas as pd 
a = {'id_1':['000d','001v','001v','001v','001c','003n','003n','003n','003n','003n'],'id_2':['5d238','5cdd4','5d36e','5d35c','5cc1a','5d89f','5d8a6','5d8b1','5d8b3','5d8cc'],'flag_1':[0,0,1,1,1,0,1,1,1,1],'flag_2':[0,0,1,1,0,0,0,1,1,1],'flag_3':[0,0,1,1,0,0,0,0,1,1]} 
pd.DataFrame(a) 

我正在尝试创建一个条件,以便每当 1 出现在列中时,对于每个唯一的 id_1 和每列独立。 我试过使用 groupby('id_1')['flag_1'].max() 创建一个额外的数据帧并稍后附加它但它不起作用(或者我很可能做错了什么) .我还尝试创建一个唯一的 id_1 值列表,然后遍历每个值以找到值为 1 的第一行并将所有其他值强制为 0,并且然后对其他列重复循环,但事实证明它非常低效且耗时。 我的预期输出是:

        id_1   id_2  flag_1  flag_2  flag_3 
0       000d  5d238       0       0       0 
1       001v  5cdd4       0       0       0 
2       001v  5d36e       1       1       1 
3       001v  5d53c       0       0       0 
4       001c  5cc1a       1       0       0 
...      ...    ...     ...     ...     ... 
124809  003n  5d89f       0       0       0 
124810  003n  5d8a6       1       0       0 
124811  003n  5d8b1       0       1       0 
124812  003n  5d8b3       0       0       1 
124813  003n  5d8cc       0       0       0 

请您参考如下方法:

你可以试试这个:

df.assign(**df.groupby('id_1')[cols].apply(lambda x: x.ne(1).shift().cumprod() * x).fillna(df)) 

输出:

   id_1   id_2 flag_1 flag_2 flag_3 
0   00d  5d238      0      0      0 
1  001v  5cdd4      0      0      0 
2  001v  5d36e      1      1      1 
3  001v  5d35c      0      0      0 
4  001c  5cc1a      1      0      0 
5  003N  5d89f      0      0      0 
6  003N  5d8a6      1      0      0 
7  003N  5d8b1      0      1      0 
8  003N  5d8b3      0      0      1 
9  003N  5d8cc      0      0      0 

基本上,在每个组上使用 ne 和 cumprod。当 flag=1 时,ne(1) 返回零并使用 cumprod 保持零。