簡體   English   中英

Pandas根據條件為每行創建唯一的id

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM