我有一個非常大的熊貓資料框,有兩列 A 和 B。對于分別在 A 和 B 列中包含值 a 和 b 的每一行,我想找到另一行具有值 a' 和 b' 以便絕對差異a 和 a' 之間盡可能小。我想創建兩個新列:一列包含兩行之間的“距離”(即 abs(a - a')),一列包含 b'。
這里有幾個例子。假設我們有以下資料框:
df = pd.DataFrame({'A' : [1, 5, 7, 2, 3, 4], 'B' : [5, 2, 7, 5, 1, 9]})
第一行有(a, b) = (1, 5)。該行的兩個新列將包含值1和5。為什么?因為最接近的值a = 1是a' = 2,它出現在第四行。該b'行中的值為5。
第二行有(a, b) = (5, 2)。該行的兩個新列將包含值1和9。最接近的值a = 5是a' = 4,它出現在最后一行。b'該行中的對應值為9。
如果a'最小化的值(a - a')不是唯一的,則可以任意打破平局(或者您可以保留所有條目)。
我相信我需要使用pandas.merge_asof允許近似加入的功能。我還認為我需要將 merge_asof函式的direction關鍵字引數設定為nearest,這將允許選擇最接近(絕對距離)左側資料幀的鍵。
我已經閱讀了 pandas.merge_asof 的整個檔案(帶有示例),但是形成正確的查詢對我來說有點棘手。
uj5u.com熱心網友回復:
使用merge_asofwithallow_exact_matches=False和direction='nearest'引數,最后用于具有絕對值的A1減法列:A
df1 = df.sort_values('A')
df = pd.merge_asof(df1,
df1.rename(columns={'A':'A1', 'B':'B1'}),
left_on='A',
right_on='A1',
allow_exact_matches=False,
direction='nearest')
df['A1'] = df['A1'].sub(df['A']).abs()
print (df)
A B A1 B1
0 1 5 1 5
1 2 5 1 5
2 3 1 1 5
3 4 9 1 1
4 5 2 1 9
5 7 7 2 2
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/497258.html
