簡體   English   中英

熊貓-基於上一行中的值的唯一ID

[英]Pandas - Unique ID based on values in prior row

我正在為一組行創建一個ID,其中該ID基於上一行中的值。 我目前已經使用for循環完成了此操作,但是由於行太多,這非常慢。 有沒有更簡單的方法可以做到這一點?

具體來說,當類別和值與上一行的類別和值不相等時,我將創建一個新的唯一ID。

df = date     category value
     1/1/2018 A        0
     1/2/2018 A        0
     1/3/2018 A        1
     1/4/2018 A        0
     1/1/2018 AB       1
     1/2/2018 AB       1
     1/3/2018 AB       1
     1/4/2018 ABC      0

df_out = date     category value unique_id
         1/1/2018 A        0     1
         1/2/2018 A        0     1
         1/3/2018 A        1     2
         1/4/2018 A        0     3
         1/1/2018 AB       1     4
         1/2/2018 AB       1     4
         1/3/2018 AB       1     4
         1/4/2018 ABC      0     5

以下方法不一定比您的循環快,但至少它沒有任何顯式循環。 首先計算下一個和上一個值之間的差。 值更改時,差不等於零:

val_diff = df['value'].diff().fillna(0) != 0 # Boolean!

該類別無法使用相同的技巧,因為無法減去字符。 獲取所有唯一類別的列表,對其進行枚舉,並使用枚舉值代替類別名稱:

unique = df['category'].unique()
unique_mapping = {y:x for x,y in enumerate(unique)}

cat_diff = df['category'].replace(unique_mapping)\
                         .diff().fillna(0) != 0

當類別的值更改時,id會增加:

df['id'] = (val_diff | cat_diff).cumsum() + 1
df
#       date category  value  id
#0  1/1/2018        A      0   1
#1  1/2/2018        A      0   1
#2  1/3/2018        A      1   2
#3  1/4/2018        A      0   3
#4  1/1/2018        B      1   4
#5  1/2/2018        B      1   4
#6  1/3/2018        B      1   4
#7  1/4/2018        B      0   5

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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