首頁  >  文章  >  後端開發  >  如何在 Pandas 中有效率地執行基於範圍的連線?

如何在 Pandas 中有效率地執行基於範圍的連線?

Linda Hamilton
Linda Hamilton原創
2024-11-02 00:19:02646瀏覽

How to Efficiently Perform Range-Based Joins in Pandas?

最佳化 Pandas 中基於範圍的聯結

使用資料訊框時,通常需要依照範圍條件執行聯結。 Pandas 中的常見方法是建立一個虛擬列,對其進行聯接,然後過濾掉不需要的行。然而,這種解決方案的計算成本可能很高,尤其是對於大型資料集。

幸運的是,有更有效率、更優雅的方法來在 Pandas 中實現基於範圍的連接。

使用 numpy 廣播

最直接的方法是利用 numpy 廣播。它涉及將 Pandas 資料幀轉換為 numpy 數組,並使用布林運算來識別匹配的行。

<code class="python">import numpy as np

a = A.A_value.values
bh = B.B_high.values
bl = B.B_low.values

i, j = np.where((a[:, None] >= bl) & (a[:, None] <= bh))

pd.concat([
    A.loc[i, :].reset_index(drop=True),
    B.loc[j, :].reset_index(drop=True)
], axis=1)</code>

這種方法非常有效,因為它避免了昂貴的行迭代。

向左擴展連接

要將此解決方案擴展到左連接,我們可以附加資料幀A 中與資料幀B 中的任何行都不匹配的剩餘行。

<code class="python">pd.concat([
    A.loc[i, :].reset_index(drop=True),
    B.loc[j, :].reset_index(drop=True)
], axis=1).append(
    A[~np.in1d(np.arange(len(A)), np.unique(i))],
    ignore_index=True, sort=False
)</code>

這可確保所有資料幀 A 中的行包含在結果中,即使它們在資料幀 B 中沒有匹配的行。

以上是如何在 Pandas 中有效率地執行基於範圍的連線?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn