我有两个数据帧。数据框A
包含有关旅行的信息:
Id Name StartTime EndTime
0 201 Car1 2016-01-01 00:00:00 2016-01-01 00:43:05
1 205 Car2 2016-01-01 00:10:00 2016-01-01 00:45:05
2 345 Car3 2016-01-01 00:01:00 2016-01-01 00:47:05
3 456 Car2 2016-01-02 00:00:00 2016-01-02 02:45:05
4 432 Car1 2016-01-02 00:00:00 2016-01-02 02:47:05
数据帧B
包含旅行期间的时间戳(如gps)。
Name Timestamp
0 Car1 2016-01-01 00:05:00
1 Car1 2016-01-01 00:05:24
2 Car2 2016-01-01 00:10:04
3 Car3 2016-01-01 00:01:04
4 Car2 2016-01-01 00:10:34
5 Car1 2016-01-01 00:05:54
我需要向名为B
的Dataframe Id
添加一个列,该列根据名称以及框架{{1中的开始和结束时间 - 从数据框A
中获取Id }}。这两个数据帧都非常大,所以我需要一种有效的方法。
答案 0 :(得分:1)
我认为您需要在Name
列上使用外部联接merge
,然后按boolean indexing
进行过滤,最后按drop
删除列:
df = pd.merge(df1, df2, on='Name', how='outer')
df = df[(df.StartTime <= df.Timestamp) & (df.EndTime >= df.Timestamp)]
df = df.drop(['StartTime','EndTime'], axis=1)
print (df)
Id Name Timestamp
0 201 Car1 2016-01-01 00:05:00
1 201 Car1 2016-01-01 00:05:24
2 201 Car1 2016-01-01 00:05:54
6 205 Car2 2016-01-01 00:10:04
7 205 Car2 2016-01-01 00:10:34
10 345 Car3 2016-01-01 00:01:04
答案 1 :(得分:1)
这似乎是最近添加的merge_asof
的情况。这将采用左数据帧(此处为数据帧B)并执行以下操作:
对于左侧DataFrame中的每一行,我们选择最后一行 正确的DataFrame&#39; on&#39; key小于或等于left 键。两个DataFrame必须按键排序。
确保我们有时间戳数据
dfa['StartTime'] = pd.to_datetime(dfa.StartTime)
dfa['EndTime'] = pd.to_datetime(dfa.EndTime)
dfb['Timestamp'] = pd.to_datetime(dfb.Timestamp)
然后对连接列进行排序
dfb = dfb.sort_values('Timestamp')
dfa = dfa.sort_values('StartTime')
通过&#39;名称&#39;
合并pd.merge_asof(dfb, dfa, left_on='Timestamp', right_on='StartTime', by='Name')
输出
Name Timestamp Id StartTime EndTime
0 Car3 2016-01-01 00:01:04 345 2016-01-01 00:01:00 2016-01-01 00:47:05
1 Car1 2016-01-01 00:05:00 201 2016-01-01 00:00:00 2016-01-01 00:43:05
2 Car1 2016-01-01 00:05:24 201 2016-01-01 00:00:00 2016-01-01 00:43:05
3 Car1 2016-01-01 00:05:54 201 2016-01-01 00:00:00 2016-01-01 00:43:05
4 Car2 2016-01-01 00:10:04 205 2016-01-01 00:10:00 2016-01-01 00:45:05
5 Car2 2016-01-01 00:10:34 205 2016-01-01 00:10:00 2016-01-01 00:45:05