2017-05-27 56 views
0

我有兩個數據幀 - df1 (800k rows) and df2 (3 rows).比較dataframes之間的值,並返回相應的值

如果df1_Adf2_A and df2_B之間的df2_C值應返回到df1_C

for index1, row1 in df1.iterrows(): 
    for index2, row2 in df2.iterrows(): 
     if (row1['df1_A'] >= row2['df2_A']) & (row1['df1_A'] <= row2['df2_B']): 
      row1['df1_C'] = row2['df2_C'] 

寫這個最簡單和可讀的方式是使用兩個for循環,但是,因爲它已經繞一圈240萬次,我的程序的性能降低。有沒有更好的方法來完成我的任務。

+0

向我們展示你的循環代碼。我不知道df2_C的值應該返回給df1_C **,這意味着當你說他們有不同的長度時。 –

+0

添加了代碼。這是我與我在一起的邏輯,但由於它必須迭代的循環次數而感到困惑。 –

回答

0

好了,你的循環代碼,轉述:

for row1 in df1.rows: 
    for row2 in df2.rows: 
     if (row1.A >= row2.A) & (row1.A <= row2.B): 
      row1.C = row2.C 

讓我們翻轉循環:

for row2 in df2.rows: 
    for row1 in df1.rows: 
     if (row1.A >= row2.A) & (row1.A <= row2.B): 
      row1.C = row2.C 

現在,除去外環不是很重要,因爲它只能運行三次。讓我們向量化內部分:

for row2 in df2.rows: 
    df1.C[(df1.A >= row2.A) & (df1.A <= row2.B)] = row2.C 

,並簡化:

for row2 in df2.rows: 
    df1.C[df1.A.between(row2.A, row2.B)] = row2.C 

我希望這是夠好。請讓我們知道這是多快。

0

讓我們使用df2只包含三行!

考慮以下量化方法:

設置:

df1 = pd.DataFrame(np.random.randint(100, size=(10**6, 1)), columns=['val']) 

df2 = pd.DataFrame({'A': {0: 1, 1: 10, 2: 20}, 'B': {0: 5, 1: 13, 2: 20}}) 

解決方案:

qry = ' | '.join(['{0[0]}<=val<={0[1]}'.format(r) for r in df2.values.tolist()]) 

df1.query(qry) 

時間:爲1.000.000行DF:

In [34]: df1.shape 
Out[34]: (1000000, 1) 

In [35]: %timeit df1.query(qry) 
10 loops, best of 3: 46.6 ms per loop 

生成的查詢:

In [36]: qry 
Out[36]: '1<=val<=5 | 10<=val<=13 | 20<=val<=20' 
相關問題