熊猫根据条件为每一行创建唯一的ID

时间:2018-12-31 22:54:26

标签: python pandas

我有一个数据集,其中的一列如下。我想根据以下条件创建一个新列。

对于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

3 个答案:

答案 0 :(得分:5)

说你的系列是

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 :(得分:2)

本质上利用以下事实:系列中的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

答案 2 :(得分:1)

在此阶段,我将使用常规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分配为数据框中的一列

相关问题