2016-12-21 50 views
4

我有两个数据帧。数据帧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拿起标识。这两个数据框都非常大,所以我需要一个有效的方法来做到这一点。

回答

1

这似乎是一个情况最近添加merge_asof。这需要左数据框(此处数据帧B)并执行以下操作:

对于左数据帧的每一行,我们在 正确的数据帧“开”键,其小于或等于选择的最后一行左边的 键。这两个DataFrames必须按键排序。

确保我们有时间戳数据

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 ASOF的 '名称'

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 
+0

感谢您的回复。我似乎没有最新版本,但对我进行更新并不容易。没有使用merge_asof有没有另一种方法。 – Amit

+0

熊猫没有条件连接。你将不得不使用@ jezrael的答案,这在许多情况下可能不可行。这就是为什么merge_asof是为像你这样的情况而建立的。这比合并然后过滤要快得多。我认为你最好的选择是更新熊猫。如果你不能轻易更新熊猫,你需要找到一个可以发生这种情况的环境,因为这对快速发展的pydata工具非常重要。 –

1

我认为你需要merge与外部连接上Name柱,然后通过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 
+0

这个答案真的有用。但你有没有基准?它有多快?在原文中明确提到需要提高效率。你怎么看? – SRC

+0

不幸的是它不是很快。如果速度更快,请再测试一次。 – jezrael