2017-05-08 6 views
2

私は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 

2つ目(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より古いです。私はトラフすべての行を反復処理以外の任意の解決策を見つけることはできませんが、私のデータは、ラインの100K大きいので、これは十分ではありません

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 

: だから、圧縮されたデータは、次のようになります。パンダでこれを行うためのツールはありますか?何か他のものを使うべきですか?

ありがとうございました!

答えて

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

質問はテーラーが – piRSquared

+0

:-) merge_asofのために作られたほとんどかのようにハッ!私はそれを考えなかった。 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() 
関連する問題