熊猫:连接两个数据帧之间的信息

时间:2016-12-21 15:29:18

标签: python pandas

我有两个数据帧。数据框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 }}。这两个数据帧都非常大,所以我需要一种有效的方法。

2 个答案:

答案 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