【问题标题】:Looking up for Column Value Existence in Different dataframe在不同的数据框中查找列值存在
【发布时间】:2019-12-30 01:59:26
【问题描述】:

我有 2 个数据框,其中包含 user_id 属于特定用户的用户活动。我需要根据某些条件在第二个数据帧上填充一个新列。这是一个例子

df1 是一个包含 user_id 和 date1 列的数据框

user_id  date1
 1       2019-07-01
 2       2019-08-04
 1       2019-08-06
 3       2019-09-03

df2 是另一个以 user_id 和 date2 为列的数据框

user_id  date2
  1     2019-07-02
  1     2019-07-03
  2     2019-08-03
  3     2019-08-04

两个数据帧都有不同的行数,对于每个用户,两个数据帧中都存在多行。

对于 df2 中的每一行,“Present_df1”列需要根据 df1 中 user_id 的相等性和日期之间的不等式条件来填充,比如 date2>date1

所以对于df2中的每一行,如果user_id和date2>date1的组合满足,我们可以把它设为1。

尝试了以下方法,但似乎不起作用:

(df2.user_id.isin(df1.user_id) & df2.date2>df1.date1).astype(int)

我来自 SQL 背景,在那里它似乎更容易可视化,但在 pandas 中我发现它很难概念化。合并选项产生一个大的笛卡尔积,所以不是一个好的思考方法

【问题讨论】:

    标签: python-3.x pandas date join


    【解决方案1】:

    请注意,对于 df2 中的特定 user_id 可以有 df1 中有 多个 行与匹配的 user_id

    所以要决定 anyall 这些行是否有 data1 (我假设“任何”情况)。

    要完成您的任务,请运行:

    df2['Present_df1'] = df2.apply(lambda row:
        df1[df1.user_id.eq(row.user_id)]\
        .date1.lt(row.date2).any().astype(int), axis=1)
    

    结果是:

       user_id      date2  Present_df1
    0        1 2019-07-02            1
    1        1 2019-07-03            1
    2        2 2019-08-03            0
    3        3 2019-08-04            0
    

    如果您改变主意 df1 中的 all 匹配行应该 如果有更早的日期,请将 any() 更改为 all()

    【讨论】:

    • 谢谢@Valdi_Bo。不知何故,您在上面给出的解决方案有一些语法错误,因为它一直出错。但是,您提供的非常好:行运算符进行迭代。对于 TrainHead.index 中的 id:user_id = (TrainHead.loc[[id],['user_id']].values[0])[0] 阈值 = (TrainHead.loc[[id],['AdThreshold_date']] .values[0])[0] function(user_id,threshold) #function 这里只检查这两个值的数组长度
    猜你喜欢
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    • 2012-05-03
    • 2020-04-07
    • 1970-01-01
    • 2020-07-30
    • 2022-06-24
    相关资源
    最近更新 更多