[英]Pandas create a unique id for each row based on a condition
我有一个数据集,其中一列如下。 我想根据以下条件创建一个新列。
对于column_name中的值,如果存在1,则创建一个新ID。 如果存在0,则还会创建新ID。 但是如果在1个以上的连续行中重复1,那么对于所有行,id应该相同。 样本输出结果如下所示。
column_name
1
0
0
1
1
1
1
0
0
1
column_name -- ID
1 -- 1
0 -- 2
0 -- 3
1 -- 4
1 -- 4
1 -- 4
1 -- 4
0 -- 5
0 -- 6
1 -- 7
说你的系列是
s = pd.Series([1, 0, 0, 1, 1, 1, 1, 0, 0, 1])
然后你可以使用:
>>> ((s != 1) | (s.shift(1) != 1)).cumsum()
0 1
1 2
2 3
3 4
4 4
5 4
6 4
7 5
8 6
9 7
dtype: int64
这将检查当前条目是否为1,或者前一个条目不是1,然后对结果执行累积求和。
基本上利用系列中的1落后于另一个1的事实应被视为同一组的一部分,而每0个都要求增量。 将发生四件事之一:
1)0,前一个0:增加1
2)0,前一个1:递增1
3)1,前一个1:递增0
4)1,前面的0:增加1
(df['column_name'] + df['column_name'].shift(1)).\ ## Creates a Series with values 0, 1, or 2 (first field is NaN)
fillna(0).\ ## Fills first field with 0
isin([0,1]).\ ## True for cases 1, 2, and 4 described above, else False (case 3)
astype('int').\ ## Integerizes it
cumsum()
输出:
0 1
1 2
2 3
3 4
4 4
5 4
6 4
7 5
8 6
9 7
在这个阶段,我只会使用常规python循环
column_name = pd.Series([1, 0, 0, 1, 1, 1, 1, 0, 0, 1])
ID = [1]
for i in range(1, len(column_name)):
ID.append(ID[-1] + ((column_name[i] + column_name[i-1]) < 2))
print(ID)
>>> [1, 2, 3, 4, 4, 4, 4, 5, 6, 7]
然后,您可以将ID指定为数据框中的列
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.