我有2个数据帧,其中包含用户的活动,其中user_id属于某个特定用户。根据一些条件,我需要在第二个dataframe上填充一个新列。下面是一个例子
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中的每一行,需要根据来自df1的user_id的相等性和日期之间的不等性条件来填充列'Present_df1‘,假设为date2>date1
因此,对于df2中的每一行,如果user_id和date2>date1的组合得到满足,我们可以将其置为1。
已尝试以下方法,但似乎不起作用:
(df2.user_id.isin(df1.user_id) & df2.date2>df1.date1).astype(int)
我来自SQL背景,在那里似乎更容易可视化,但在熊猫中,我发现它有点难以概念化。合并选项会产生一个很大的笛卡尔积,因此不是一个好的思考方法
发布于 2019-08-25 19:12:01
请注意,对于df2中的特定user_id,df1中可以有多个行与匹配的user_id。
因此,它将决定这些行的所有或是否具有data1 < data2 (我假设为"any“情况)。
要执行您的任务,请运行:
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中所有与匹配的行都应该具有更早的日期,请将any()更改为()。
https://stackoverflow.com/questions/57648384
复制相似问题