2017-11-01 23 views
1

私は2つのデータフレームを持っています。私はループの形で私の要件を説明します - これは私が問題を視覚化する方法なので、 私は別の解決法があるかもしれないことを認識しています。もしこれが異なることができれば、気軽に共有してください!私はパンダには新しいので、私はこの解決策に苦労しています。私の質問を見てくれてありがとう!パンダ2つのデータフレームを比較する

私はID、ODO、ODOLengthという3つの列を持つ2つのデータフレームを持っています。 ODOLengthは、私が使用して得た各ODOレコード、のために実行されているの違いです:次のようにabs(Df1['Odo'] - Df1['Odo'].shift(-1))

OldDataSet = {'id' : [10,20,30,40,50,60,70,80,90,100,110,120,130,140],'Odo': [-1.09,1.02,26.12,43.12,46.81,56.23,111.07,166.38,191.27,196.41,207.74,231.61,235.84,240.04], 'OdoLength':[2.11,25.1,17,3.69,9.42,54.84,55.31,24.89,5.14,11.33,23.87,4.23,4.2,4.09]} 

NewDataSet = {'id' : [1000,2000,3000,4000,5000,6000,7000,8000,9000,10000,11000,12000,13000,14000],'Odo': [1.51,2.68,4.72,25.03,42,45.74,55.15,110.05,165.41,170.48,172.39,190.35,195.44,206.78], 'OdoLength':[1.17,2.04,20.31,16.97,3.74,9.41,54.9,55.36,5.07,1.91,17.96,5.09,11.34,23.89]} 

FinalResultDataSet = {'DFOneId':[10,20,30,40,50,60,70,80,90,100,110], 'DFTwoID' : [1000,3000,4000,5000,6000,7000,8000,11000,12000,13000,14000], 'OdoDiff': [2.6,3.7,1.09,1.12,1.07,1.08,1.02,6.01,0.92,0.97,0.96], 'OdoLengthDiff':[0.94,4.79,0.03,0.05,0.01,0.06,0.05,6.93,0.05,0.01,0.02], 'OdoAndLengthDiff':[1.66,1.09,1.06,1.07,1.06,1.02,0.97,0.92,0.87,0.96,0.94]} 


df1= pd.DataFrame(OldDataSet) 

df2 = pd.DataFrame(NewDataSet) 

FinalDf = pd.DataFrame(FinalResultDataSet) 

FinalDFを取得する方法の背後にあるロジックは次のとおりです。DF1から小戸とOdoLenを取り、各小戸とOdoLen列からそれを差し引きますin df2。差の最小値を取って、それに合わせます。 Df1とDf2の次の比較のために、一致しない最初のDf2レコードから始めます。 Df2値が最小値でない場合、比較されている現在のDf1値 に対して、DF2のそのレコードは最終データセットに含まれません。例えば、Df1 ID 20-はDf2 ID 2000と比較され、最終結果は21.4((DfOne.ODO:1.02-DfTwo.ODO:2.68) - (DfOneODOLen:25.1-DfTwo.ODoLen-2.04)= 21.4)であったが、 Df1 ID20をDf2 3000と比較した場合、最終差は1.09((DfOne.ODO:1.02-DfTwo.ODO:4.72) - (DfOneODOLen:25.1-DfTwo.ODoLen-20.31)= 1.06)である。この場合、Df2 ID 3000はDF1 ID 20と一致し、Df2 ID-2000は削除されます。 の差が大きいためです。この時点で、DF2 ID 2000は他のマッチでは考慮されません。次のDF1レコードの比較は、DF2 ID 4000で開始されます。これは、一致しない次の値であるためです。

私が言ったように、私はすべての提案に開放されています!

ありがとうございます!

あなたが merge_asof

ステップ1を使用することができ

答えて

1

:データフレームを組み合わせ

df1['match']=df1.Odo+df1.OdoLength 
df2['match']=df2.Odo+df2.OdoLength 

out=pd.merge_asof(df1,df2,on='match',direction='nearest') 
out.drop_duplicates(['id_y']) 
Out[728]: 
    Odo_x OdoLength_x id_x match Odo_y OdoLength_y id_y 
0 -1.09   2.11 10 1.02 1.51   1.17 1000 
1  1.02  25.10 20 26.12 4.72  20.31 3000 
2 26.12  17.00 30 43.12 25.03  16.97 4000 
3 43.12   3.69 40 46.81 42.00   3.74 5000 
4 46.81   9.42 50 56.23 45.74   9.41 6000 
5 56.23  54.84 60 111.07 55.15  54.90 7000 
6 111.07  55.31 70 166.38 110.05  55.36 8000 
7 166.38  24.89 80 191.27 172.39  17.96 11000 
8 191.27   5.14 90 196.41 190.35   5.09 12000 
9 196.41  11.33 100 207.74 195.44  11.34 13000 
10 207.74  23.87 110 231.61 206.78  23.89 14000 

次にステップ2

あなたの新しい列を取得するには、以下のような何かを行うことができます

out['OdoAndLengthDiff']=out.OdoLength_x-out.OdoLength_y+out.Odo_x-out.Odo_y 

B TW必要に応じて新しい値を取得した後で、列を削除しませんでした。out=out.drop([columns],1)

+0

Wow ....これは素晴らしいです。これはまさに私が探しているものです。私はコードの行がいかに少ないかに驚いています。 SQL Serverでは、これは悪夢になるでしょう!どうもありがとうございます!! – yanci

+0

@yanciどうか私の答えを受け入れる〜;-) – Wen

+0

私は重要な部分を忘れてしまったコードに驚きました! :-) – yanci

関連する問題