2017-05-08 51 views
2

我有兩個Pandas數據框。第一個看起來像(db1):根據來自另一個DataFrame的日期之間的日期加入DataFrame

id date_from date_until v1 v2 
0 2015-06-17 2015-06-19 2 3 
0 2015-06-17 2015-07-01 3 4 
1 2015-06-18 2015-06-20 5 6 
1 2015-06-19 2015-07-12 5 4 

,第二個(db2),像這樣:

id  date  v3 v4 
0 2015-06-17 4 3 
1 2015-06-17 5 6 
1 2015-06-18 6 4 

沒有我想要讓他們根據iddate對其進行壓縮。如果db2.date年齡大於或等於db1.date_from,並且使用db2中最年輕的一個,則該日期壓縮應該是舊的或等於db1.data_from。 因此壓縮的數據應該是這個樣子:

id date_from date_until  date  v1 v2 v3 v4 
0 2015-06-17 2015-06-19 2015-06-17 2 3 4 3 
0 2015-06-17 2015-07-01 2015-06-17 3 4 4 3 
1 2015-06-18 2015-06-20 2015-06-18 5 6 6 4 
1 2015-06-19 2015-07-12 2015-06-18 5 4 6 4 

我無法找到除了迭代低谷中的所有行的任何解決方案,但因爲我的數據線的大100K,這是不夠好。是否有任何工具可以在熊貓中做到這一點,或者我應該使用其他的東西嗎?

謝謝!

回答

3

讓我們使用pd.merge_asof

pd.merge_asof(df1,df2, left_on=['date_from'], right_on=['date'], by='id') 

輸出:

id date_from date_until v1 v2  date v3 v4 
0 0 2015-06-17 2015-06-19 2 3 2015-06-17 4 3 
1 0 2015-06-17 2015-07-01 3 4 2015-06-17 4 3 
2 1 2015-06-18 2015-06-20 5 6 2015-06-18 6 4 
3 1 2015-06-19 2015-07-12 5 4 2015-06-18 6 4 
+0

幾乎一樣,如果這個問題是裁縫爲merge_asof :-) – piRSquared

+0

做哈!我沒有想到這一點。很高興看到merge_asof得到一些關注 – piRSquared

2

另一種方式來做到這一點:

import pandas as pd 

import sys 
if sys.version_info[0] < 3: 
    from StringIO import StringIO 
else: 
    from io import StringIO 

a = StringIO('''id,date_from,date_until,v1,v2 
0,2015-06-17,2015-06-19,2,3 
0,2015-06-17,2015-07-01,3,4 
1,2015-06-18,2015-06-20,5,6 
1,2015-06-19,2015-07-12,5,4''') 

b = StringIO('''id,date,v3,v4 
0,2015-06-17,4,3 
1,2015-06-17,5,6 
1,2015-06-18,6,4''') 

df1 = pd.read_csv(a, sep=',') 
df2 = pd.read_csv(b, sep=',') 
df1.merge(df2, how='left', left_on=['id', 'date_from'], right_on=['id', 'date']).ffill() 
相關問題