我有一个数据框(在下面,即隶属关系),一个字段(A)以排序的方式在该行中包含值。还有一个新字段(新),该字段在过程开始时是字段C
的副本。我想做的是,如果A
中的上一行与A
中的当前行相同,并且如果new
的当前行还是{ {1}}是new
,将1分配给当前1
。最后,在new
的重复值的最后,A
将是new
或1
,具体取决于函数中的条件和先前的值,其中{{ 1}}重复将0
设为A
。我可以通过下面的功能来实现。
new
此数据帧上此函数的结果位于此enter image description here
中问题是,我有一个非常大的数据集,并且在它上运行此函数非常慢。如何改善代码使其更快?我知道如果我能够在熊猫中向量化此功能,时间将会大大缩短。如何对这个函数进行矢量化处理?
答案 0 :(得分:0)
IIUC,让我解释一下逻辑,看看是否匹配。
如果在A的任何组中,C的值等于1,则将“ new”列的值1分配给该组中的最后一个记录。
membership['new'] = membership.groupby('A')['C']\
.transform(lambda x: np.where(x.index == x.index[-1],
x.max(), 0))
输出:
A B C new
0 20000000460 4 1 0
1 20000000460 0 1 0
2 20000000460 5 0 0
3 20000000460 0 0 1
4 20000000459 6 0 0
5 20000000461 0 1 0
6 20000000461 2 0 1
7 20000000462 5 1 1
8 20000000464 6 1 0
9 20000000464 7 1 0
10 20000000464 4 0 0
11 20000000464 3 0 1
12 20000000465 2 0 0
13 20000000465 7 0 0
14 20000000466 9 1 1