我正在处理一个中型数据框并进行了大量数据操作,我最终得到以下数据框:
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 保持零。
