[英]Pandas: Connecting information between two dataframes
我有两个数据帧。 数据框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
叫Id
,从数据框中拾起标识A
基于名称和帧的开始时间和结束时间A
。 这两个数据帧都非常大,所以我需要一种有效的方法。
我认为您需要在列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
这似乎是最近添加的merge_asof
。 这需要左侧数据帧(此处是数据帧B)并执行以下操作:
对于左侧DataFrame中的每一行,我们选择右侧DataFrame中的最后一行,其中“on”键小于或等于左侧的键。 两个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')
Perfom由'名字'合并
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.