[英]create unique identifier in dataframe based on combination of columns, but only for duplicated rows
[英]Assign unique identifier for dataframe rows based on dataframe with preassigned unique identifier
我有 dataframe 具有基於三列分配的唯一標識符,即 [col2,col3,col3]
數據框1:
col1 col2 col3 col4 col5 unique_id
1 abc bcv zxc www.com 8
2 bcd qwe rty www.@com 12
3 klp oiu ytr www.io 15
4 zxc qwe rty www.com 6
數據預處理后,將導入具有與上圖相同的列值但沒有 unique_id 的 Dataframe_2。 Dataframe_2 行必須根據 col2、col3、col4 並通過引用 Dataframe1 分配唯一標識符。
如果 Dataframe_2 具有 Dataframe1 中不存在的新行,則分配新標識符。
數據框_2:
col1 col2 col3 col4 col5
1 bcd qwe rty www.@com
2 zxc qwe rty www.com
3 abc bcv zxc www.com
4 kph hir mat www.com
預期的 Dataframe_2:
col1 col2 col3 col4 col5 unique_id
1 bcd qwe rty www.@com 12
2 zxc qwe rty www.com 6
3 abc bcv zxc www.com 8
4 kph hir mat www.com 35
由於 Dataframe1 中不存在 Row4,因此分配了一個新的唯一標識符。
# assign the old unique_id
df2n = df2.join(df1.set_index(['col2', 'col3', 'col4', 'col5'])[['unique_id']],
on=['col2', 'col3', 'col4', 'col5'], how='left')
# assign new unique_id with max df1.unique_id + 1
id_max = df1.unique_id.max() + 1
null_num = df2n['unique_id'].isnull().sum()
cond = df2n['unique_id'].isnull()
df2n.loc[cond,'unique_id'] = range(id_max, id_max + null_num)
df2n['unique_id'] = df2n['unique_id'].astype(int)
print(df2n)
col1 col2 col3 col4 col5 unique_id
0 1 bcd qwe rty www.@com 12
1 2 zxc qwe rty www.com 6
2 3 abc bcv zxc www.com 8
3 4 kph hir mat www.com 16
首先通過DataFrame.merge
添加列unique_id
, on
子集中指定的列['col2','col3','col4']
合並,省略左連接參數。 對於不匹配的值,創建缺失值,因此使用Series.isna
測試它們,使用np.arange
在最大值后創建新數組並在DataFrame.loc
中分配它們
df = Dataframe_2.merge(Dataframe_1[['col2','col3','col4', 'unique_id']],
how='left')
mask = df['unique_id'].isna()
maximal = Dataframe_1['unique_id'].max() + 1
df.loc[mask, 'unique_id'] = np.arange(maximal, maximal + mask.sum())
df['unique_id'] = df['unique_id'].astype(int)
print (df)
col1 col2 col3 col4 col5 unique_id
0 1 bcd qwe rty www.@com 12
1 2 zxc qwe rty www.com 6
2 3 abc bcv zxc www.com 8
3 4 kph hir mat www.com 16
import math
import random
import pandas as pd
import numpy as np
df3 = pd.merge(df1,df2, on=['col2','col3','col4'], how='right')
def return_unique_num(df1):
uniqueIds = list(df1['unique_id'].values)
unique_num = random.randint(1,len(df1)+1)
while True:
if unique_num in uniqueIds:
unique_num = random.randint(1,len(df1)+1)
else:
break
return unique_num
for i, e in enumerate(df3['unique_id']):
if math.isnan(e):
df3.iloc[i, 5] = return_unique_num(df1) #replace nan value with unique integer in df3 unique_id column
df3['unique_id'] = df3['unique_id'].astype(int)
df2['unique_id'] = df3['unique_id']
它將根據 df1 的 unique_id 為 df2 分配唯一 ID
Output
col1 col2 col3 col4 col5 unique_id
1 bcd qwe rty www.@com 12
2 zxc qwe rty www.com 6
3 abc bcv zxc www.com 8
4 kph hir mat www.com 35
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.