我有如下所示的数据帧
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_id,这是不正确的。
我尝试了以下方法(基于此post)
cumcount = df.groupby(['person_id','login_id']).login_id.cumcount()
df.login_id = df.login_id.mul(100000).add(cumcount)
虽然对于给定的样例数据集,上面的操作可以很好地工作,但是当存在实际匹配的login_id1100001
、1100002
、1100003
时,它可能会失败。因此,如果我将00001
,00002
附加到我login_id = 11
,它可能会与原始ID(1100001
,1100002
,1100003)
冲突
我们不必只附加零来表示序列。任何与其他ID不冲突的数字都可以(并且不一定要一个接一个地按顺序排列)。我们只需要获取一些不与其他ID冲突的ID
如何在不与其他用户的其他login_id冲突的情况下,生成一个随机数来指示login_id?我如何决定要追加的数字? 请注意,我想将此应用于大数据,LOGIN_ID可能不仅仅是实际数据中的个位数。例如,第一个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不会冲突。有什么建议或建议吗?
输出如下
这篇关于通过在不与其他值冲突的情况下追加值来生成序列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!