获取dataframe中每个用户发生类别更改的日期

2024-09-27 19:28:23 发布

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

我使用pandas==1.2.1

MRE:

x = pd.DataFrame({"date":["20201211", "20201211", "20201212", "20201222", "20201222","20201223",
                          "20201211", "20201211", "20201212", "20201222", "20201222"],
                  "userid":["A", "A", "A", "A", "A", "A","B", "B", "B", "B", "B"],
                  "category":[1,1,2,2,2,1, 33, 33, 33, 34, 34]})

看起来是这样的:

    date    userid  category
0   20201211    A   1
1   20201211    A   1
2   20201212    A   2
3   20201222    A   2
4   20201222    A   2
5   20201223    A   1
6   20201211    B   33
7   20201211    B   33
8   20201212    B   33
9   20201222    B   34
10  20201222    B   34

我想做的是获取每个用户类别更改时的日期

因此,所需的数据帧应如下所示:

user         cat_changed             changed_cat
  A      [20201212, 20201223]         [2, 1]
  B          [20201222]                [34]

我已经尝试过按用户ID、cate、日期分组,但是从那以后就被卡住了


Tags: 数据用户iddataframepandasdate类别cat
2条回答

您可以尝试使用df.shift,同时考虑useridcategory,然后创建一个分组列来分组:

u = x[['userid','category']]
c = u.ne(u.shift())
out = (x.groupby(['userid',c.any(1).mask(c.all(1)).replace(0,np.nan)])
       .agg(list).droplevel(1))

print(out)

                        date category
userid                               
A       [20201212, 20201223]   [2, 1]
B                 [20201222]     [34]

您可以首先使用category上的diff()获取转换点,然后索引这些转换并聚合为list

>>> transitions = x.groupby('userid').category.diff().fillna(0).ne(0)
>>> x[transitions].groupby('userid').agg(list)

                          date  category
userid
     A    [20201212, 20201223]    [2, 1]
     B              [20201222]      [34]

相关问题 更多 >

    热门问题