2016-12-21 51 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