【发布时间】:2020-09-01 01:04:30
【问题描述】:
我有一个包含会话和出价数据的数据框,其中包含三列(感兴趣的):user_id、事件和日期。
- user_id 只是一个标识用户的 ID
- 事件是出价或会话
- 日期是一个日期时间对象
现在我要做的是在我的数据框中添加一列,即第一次出价的日期。我已经尝试了几种方法来让它工作,但问题是用户在出价之前生成会话当然很常见。
我已经尝试了几种方法来让过滤器工作,但它似乎不像我认为的那样工作。从文档中它说“返回 DataFrame 的副本,不包括不满足 func 指定的布尔标准的组中的元素。”这听起来像我想要的,忽略组中会话而不是出价的事件。
df['first bid date'] = df.groupby('user_id').filter(lambda x: x['event'] == 'bid')['date'].transform('min')
当这不起作用时,我尝试让转换采用自定义函数,如下所示:
def custom_transform(group):
return group[group['event'] == 'bid']['date'].min()
df['first bid date'] = df.groupby('user_id').['date'].transform(custom_transform)
但这不起作用,因为转换无法同时访问日期和事件,似乎无论我如何分组。
最后我尝试按 user_id 和这样的事件进行分组
df['first bid date'] = df.groupby(['user_id', 'event'])['date'].transform('min')
哪种方法有效,但我不得不将所有第一个会话更改为第一个出价,因为现在有一个第一个会话和一个第一个出价。
有任何输入可以让这个 oneliner 工作吗?似乎 groupby、filter 和 transform 的组合应该可以解决问题,但我无法破解它。
谢谢!
【问题讨论】:
-
你能分享 df 中包含的示例数据吗?
-
我可以,但是如何在此处粘贴样本而不会使格式看起来很奇怪?
标签: python pandas dataframe filter transform