基于时间的关系



我正在尝试创建两个相关数据帧之间的关系,但是没有创建关系的键。下面是我的问题布局:我使用的第一个数据帧是关于人们何时进入游乐园的信息。在这个游乐园里,人们可以在里面呆上好几天。这个数据帧的结构是

<表类> id 名称 日期 tbody><<tr>0约翰·史密斯07-01-2020 10:13:241约翰·史密斯07-22-2020 09:47:044Jane Doe07-22-2020 09:47:042Jane Doe06-13-2020 13:27:533托马斯·华莱士07-08-2020 11:15:28

尝试使用apply()asof():

df1 = df1.set_index("date").sort_index() #asof requires a sorted index
df2["id"] = df2.apply(lambda x: df1[df1["Name"]==x["Name"]]["id"].asof(x["date"]), axis=1)
>>> df2
Name          ride                date  id
0      John Smith      Insanity 2020-07-01 13:53:07   0
1      John Smith   Bumper Cars 2020-07-01 16:37:29   0
2      John Smith  Tilt-A-Whirl 2020-07-02 08:21:18   0
3      John Smith      Insanity 2020-07-22 11:44:32   1
4        Jane Doe   Bumper Cars 2020-06-13 14:14:41   2
5        Jane Doe       Teacups 2020-06-13 17:31:56   2
6  Thomas Wallace      Insanity 2020-07-08 13:20:23   3

认为这就是你需要的。这些id不是你指定的顺序,但它们确实代表了访问id,符合你所要求的逻辑。

merged = pd.merge(df1, df2, how="right", left_on=['date', 'name'], right_on=['name', 'ride'])[['name_y', 'ride', 'date_y']]
merged['ymd'] = pd.to_datetime(merged.date_y).apply(lambda x: x.strftime('%Y-%m-%d'))
merged['id'] = merged.groupby(['name_y', 'ymd']).ngroup()
merged.drop('ymd', axis=1, inplace=True)
merged.columns = ['name', 'ride', 'date', 'id']
merged.sort_values(by='id', inplace=True)
print(merged)

:

name           ride                 date  id
4        Jane Doe   Bumper Cars   06-13-2020 14:14:41   0
5        Jane Doe       Teacups   06-13-2020 17:31:56   0
0      John Smith      Insanity   07-01-2020 13:53:07   1
1      John Smith   Bumper Cars   07-01-2020 16:37:29   1
2      John Smith  Tilt-A-Whirl   07-02-2020 08:21:18   2
3      John Smith      Insanity   07-22-2020 11:44:32   3
6  Thomas Wallace       Insanity  07-08-2020 13:20:23   4

最新更新