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