首页 > 解决方案 > 在熊猫数据框中计算与不同值交错的重复项

问题描述

这是我的数据的一个非常简化的版本:

    ╔═════════╤═══════════╗
    ║ user_id │ module_id ║
    ╠═════════╪═══════════╣
    ║ 1       │ 1         ║
    ╟─────────┼───────────╢
    ║ 1       │ 1         ║
    ╟─────────┼───────────╢
    ║ 1       │ 2         ║
    ╟─────────┼───────────╢
    ║ 1       │ 1         ║
    ╟─────────┼───────────╢
    ║ 2       │ 2         ║
    ╟─────────┼───────────╢
    ║ 2       │ 1         ║
    ╟─────────┼───────────╢
    ║ 2       │ 2         ║
    ╟─────────┼───────────╢
    ║ 2       │ 2         ║
    ╟─────────┼───────────╢
    ║ 2       │ 1         ║
    ╟─────────┼───────────╢
    ║ 2       │ 2         ║
    ╚═════════╧═══════════╝

这是我想添加的专栏:

    ╔═════════╤═══════════╤════════════════════╗
    ║ user_id │ module_id │ repeated_module_id ║
    ╠═════════╪═══════════╪════════════════════╣
    ║ 1       │ 1         │ NaN                ║
    ╟─────────┼───────────┼────────────────────╢
    ║ 1       │ 1         │ NaN                ║
    ╟─────────┼───────────┼────────────────────╢
    ║ 1       │ 2         │ NaN                ║
    ╟─────────┼───────────┼────────────────────╢
    ║ 1       │ 1         │ 1                  ║
    ╟─────────┼───────────┼────────────────────╢
    ║ 2       │ 2         │ NaN                ║
    ╟─────────┼───────────┼────────────────────╢
    ║ 2       │ 1         │ NaN                ║
    ╟─────────┼───────────┼────────────────────╢
    ║ 2       │ 2         │ 2                  ║
    ╟─────────┼───────────┼────────────────────╢
    ║ 2       │ 2         │ NaN                ║
    ╟─────────┼───────────┼────────────────────╢
    ║ 2       │ 1         │ 1                  ║
    ╟─────────┼───────────┼────────────────────╢
    ║ 2       │ 2         │ 2                  ║
    ╚═════════╧═══════════╧════════════════════╝

即,如果用户之前完成了一个模块,但之前没有完成,则重复该模块。

我想要一种矢量化的熊猫方式来推导它,但我不知道如何开始。

标签: pandas

解决方案


IIUC,你可以试试:

df=df.assign(repeated_module_id=df.loc[df.groupby('user_id')['module_id'].apply(lambda x:
        x.ne(x.shift())&x.duplicated()),'module_id'])

   user_id  module_id  repeated_module_id
0        1          1                 NaN
1        1          1                 NaN
2        1          2                 NaN
3        1          1                 1.0
4        2          2                 NaN
5        2          1                 NaN
6        2          2                 2.0
7        2          2                 NaN
8        2          1                 1.0
9        2          2                 2.0

推荐阅读