簡體   English   中英

通過附加值而不與其他值發生沖突來生成序列

[英]Generate a sequence by appending values without clash in other values

我有一個如下所示的數據框

df = pd.DataFrame({'person_id': [101,101,101,101,202,202,202],
                        'login_date':['5/7/2013 09:27:00 AM','09/08/2013 11:21:00 AM','06/06/2014 08:00:00 AM','06/06/2014 05:00:00 AM','12/11/2011 10:00:00 AM','13/10/2012 12:00:00 AM','13/12/2012 11:45:00 AM']})
df.login_date = pd.to_datetime(df.login_date)
df['logout_date'] = df.login_date + pd.Timedelta(days=5)
df['login_id'] = [1,1,1,1,11,11,11]

如果您查看上述數據person_id = 101 ,他/她已在 4 個不同的時間戳登錄和退出,但具有相同的 login_ids,這是不正確的。

相反,我想為每個唯一的登錄會話生成一個新的 login_id,其中每個人都會獲得一個新的 login_id,但在其后續登錄中保留第一個 login_id 信息。 所以,我們可以知道它是一個序列

我嘗試了以下(基於這篇文章

cumcount = df.groupby(['person_id','login_id']).login_id.cumcount()
df.login_id = df.login_id.mul(100000).add(cumcount)

雖然上述對於給定的示例數據集確實可以正常工作,但是當存在實際匹配的 login_id 110000111000021100003時,它可能會失敗。 因此,如果我將00001 , 00002附加到我的login_id = 11 ,它可能會與原始 ID (1100001 , 1100002 , 1100003)發生沖突

我們不必只附加零來表示序列。 任何不與其他 id 沖突的數字都可以(並且不必像一個接一個那樣按順序排列)。 我們只需要獲取一些不與其他 id 沖突的 id

如何生成一個隨機數來指示 login_id 而不會與其他用戶的其他 login_id 發生沖突? 我如何決定要附加的數字?

請注意,我想將其應用於大數據,並且 login_ids 可能不僅僅是真實數據中的一位數。 例如,第一個 login_id 甚至可能是 576869578 等類型的隨機數。

我嘗試根據數據幀的長度附加零以避免與現有 ID 發生任何沖突。 歡迎提出任何改進此解決方案的建議。 這適用於小數據,但在較大的數據幀上失敗

cumcount = df.groupby(['person_id','login_id']).login_id.cumcount()
df.login_id = df.groupby(['person_id','login_id']).login_id.transform(lambda x: x.shift().mul(int('1'+'0'*(len(str(len(df)))+1))).fillna(x.min())).add(cumcount)

我不認為 ID 現在會發生沖突。 有什么建議或意見嗎?

輸出如下所示

在此處輸入圖片說明

暫無
暫無

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

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