在Python中转换用户访问矩阵中的用户访问数据帧

2024-06-16 15:50:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个数据帧:

d = pd.DataFrame({
'users': [
    [('007', "us1", "us2", "time1", 'time2', 4)],
    [('008', "us1", "us2", "time1", 'time2', 5)],
    [('009', "us1", "us2", "time1", 'time2', 6)],
    [('007', 'us2', "us3", "time1", 'time2', 4)],
    [('008', 'us2', "us3", "time1", 'time2', 7)], 
    [('009', 'us2', "us3", "time1", 'time2', 11)], 
    [('001', 'us5', 'us1', "time1", 'time2', 0)], 
    [('008', 'us5', 'us1', "time1", 'time2', 1)], 
    [('007',"us3", "us2", "time1", 'time2', 2)],
    [('007',"us3", "us2", "time1", 'time2', 34)],
    [('009',"us3", "us2", "time1", 'time2', 67)]]
  })

enter image description here

一个元组是(ID,user1,user2,timeAcess user1,timeAcess user2,delay),我希望结果是在一个矩阵上的用户访问ID的列表,如下所示:

enter image description here

另外,我只想在矩阵的列表中添加在某个delayTime(元组的最后一部分是数字)内的Id。因此,例如,如果我决定delayTime应该大于7,那么小于7的Id将不会添加到矩阵中

我可以提取每个用户元组访问的Id列表:

d = d.groupby(d['users'].str[1:3], sort=False)['users'].apply(list).reset_index(level=0, drop=True).reset_index()
d['IDsAcess'] = d['users'].apply(lambda x: [y[0] for y in x])

因为在这之后我被封锁了


Tags: id列表矩阵users元组user1user2time1
1条回答
网友
1楼 · 发布于 2024-06-16 15:50:45
>>> df = pd.DataFrame({
... 'users': [
...     [('007', "us1", "us2", "time1", 'time2', 4)],
...     [('008', "us1", "us2", "time1", 'time2', 5)],
...     [('009', "us1", "us2", "time1", 'time2', 6)],
...     [('007', 'us2', "us3", "time1", 'time2', 4)],
...     [('008', 'us2', "us3", "time1", 'time2', 7)], 
...     [('009', 'us2', "us3", "time1", 'time2', 11)], 
...     [('001', 'us5', 'us1', "time1", 'time2', 0)], 
...     [('008', 'us5', 'us1', "time1", 'time2', 1)], 
...     [('007',"us3", "us2", "time1", 'time2', 2)],
...     [('007',"us3", "us2", "time1", 'time2', 34)],
...     [('009',"us3", "us2", "time1", 'time2', 67)]]
...   })
>>> df =(pd.DataFrame(df["users"].explode().tolist(),columns=["ID","USER1","USER2","TAU1","TAU2","DELAY"])
.groupby(["USER1","USER2"])["ID"].agg(list).to_frame().unstack())
    >>> df
                   ID                                  
    USER2         us1              us2              us3
    USER1                                              
    us1           NaN  [007, 008, 009]              NaN
    us2           NaN              NaN  [007, 008, 009]
    us3           NaN  [007, 007, 009]              NaN
    us5    [001, 008]              NaN              NaN

然后您可以展平ID级别,添加一个新的us5列,并用空列表填充NAN

编辑

如果不希望某些条目进入列表,可以在groupby之前删除小于(或大于)首选值的行

EDIT2

>>> df =(pd.DataFrame(df["users"].explode().tolist(),columns=["ID","USER1","USER2","TAU1","TAU2","DELAY"])
... .groupby(["USER1","USER2"])["ID"].agg(list).to_frame().unstack())
>>> df.columns = df.columns.get_level_values(1)
>>> combined = df.index|df.columns
>>> for col in combined:
...     if col not in df.columns:
...         df[col] = np.nan
>>> df
USER2         us1              us2              us3  us5
USER1                                                   
us1           NaN  [007, 008, 009]              NaN  NaN
us2           NaN              NaN  [007, 008, 009]  NaN
us3           NaN  [007, 007, 009]              NaN  NaN
us5    [001, 008]              NaN              NaN  NaN

相关问题 更多 >