按第一个元组元素折叠元组列

时间:2020-07-15 07:43:03

标签: python-3.x pandas tuples pandas-groupby

:)

我有这个数据集:

r = pd.DataFrame({'duplicates': [ [("007", "us1", "us2", 7, 1),  ("001", "us1", "us2", 9, 8), ("009", "us1", "us2", 28, 27)], ("007", "us2", "us1", 8, 15), ("009", "us4", "us1", 29, 30), ("009", "us4", "us1", 29, 30)], 
     'id': ["b", 'c', 'b', "c"]})

duplicates                                                                 id
0   [(007, us1, us2, 7, 1), (001, us1, us2, 9, 8), (009, us1, us2, 28, 27)] b
1   (007, us2, us1, 8, 15)  c
2   (009, us4, us1, 29, 30) b
3   (009, us4, us1, 29, 30) c

此处,元组根据us1,us2顺序分组。因此,如果元组具有相同的“ id”和相同的用户序列,则它们位于同一行中。例如,在第一行中,us2在时间7访问记录007。同样,us1在时间01访问记录007。

我想要的是这个

j = pd.DataFrame({'duplicates': [ ("007", ['us2', 'us1', 'us2', 'us1'], 1, 7, 8, 15),  ("001", ['us2', 'us1'], 8, 9), ("009", ['us2', 'us1', 'us4', 'us1'], 27, 28, 29, 30), ("009", ['us4', 'us1'], 29, 30)], 
     'id': ["b", "b", 'b', "c"]})

     duplicates                                id
0   (007, [us2, us1, us2, us1], 1, 7, 8, 15)    b
1   (001, [us2, us1], 8, 9) b
2   (009, [us2, us1, us4, us1], 27, 28, 29, 30) b
3   (009, [us4, us1], 29, 30)   c

在这种情况下,我想按ID和元组的第一部分进行分组。例如,在第一行中,我使用“ 007”和“ id”作为键,然后根据时间访问来添加用户。所以us2在us1之前,因为us2在时间1访问,而us1在时间7访问,而1 <7。

这是我到目前为止所拥有的,但是与结果相去甚远,我不知道该怎么办:

r.explode('duplicates').groupby(['id',  r['duplicates'].str[0]])['duplicates'].apply(list).reset_index(level=1, drop=True).reset_index()

非常感谢!

0 个答案:

没有答案