我有一個有 7 列的資料框。我想用方程的輸出創建第 8 列。等式是:從第 2-7 列中,對于高于 Col 1 的那些數字,將最小值輸出到 Col 8。
在 excel 中,我會在 Col8 中使用這個公式: =MINIFS($Col2:$Col7,$Col2:$Col7,">"&$Col1)
Date_Time Col1 Col2 Col3 Col4 Col5 Col6 Col7
20 3/14/2022 0:35 0.68053 0.68048 0.68094 0.6811 0.68111 0.68126 0.68179
21 3/14/2022 0:36 0.6805 0.6805 0.68091 0.68109 0.68111 0.68125 0.68178
22 3/14/2022 0:37 0.68052 0.68051 0.68089 0.68107 0.6811 0.68124 0.68177
23 3/14/2022 0:38 0.68057 0.6805 0.68086 0.68106 0.6811 0.68123 0.68176
24 3/14/2022 0:39 0.68055 0.6805 0.68083 0.68104 0.68109 0.68122 0.68175
上述資料樣本的輸出將是:
Col8
0.68094
0.68091
0.68089
0.68086
0.68083
我已經閱讀了很多帖子,并嘗試使用 np.where:
ColList = [Col2,Col3,Col4,Col5,Col6,Col7]
df['Col8'] = np.where(df[ColList ].min(axis=1) > df['Col1'],df[ColList ].min(axis=1),np.nan)
但它正在查找串列中的最小數字,然后檢查該最小數字是否大于 Col1。我正在尋找的是反向執行它:因為它只查看大于 Col1 的數字并回傳這些數字中的最小值(如果沒有大于 Col1 的數字,則回傳 np.nan)。
我更喜歡矢量化解決方案,因為資料集非常大。否則,我只會創建一個函式/回圈來執行此操作。
uj5u.com熱心網友回復:
IIUC,您想要最接近的值。使用掩碼的一種方法:
s = df[["Col1"]].values
tmp = df.loc[:, "Col2":] - s
tmp[tmp<=0] = np.inf
df["Col8"] = tmp.min(axis=1) s.ravel()
輸出:
print(df["Col8"])
20 0.68094
21 0.68091
22 0.68089
23 0.68086
24 0.68083
Name: Col8, dtype: float64
邏輯:
Col1我們首先計算與他人之間的距離。- 然后任何負距離(即小于 的距離
Col1)被替換numpy.inf為排除在最小比較中。
表現:
df = df.sample(n=100000, replace=True).reset_index(drop=True)
%%timeit
s = df[["Col1"]].values
tmp = df.loc[:, "Col2":] - s
tmp[tmp<=0] = np.inf
df["Col8"] = tmp.min(axis=1) s.ravel()
# 13.1 ms ± 379 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
uj5u.com熱心網友回復:
一種選擇是在 numpy 中進行比較,然后使用pd.where并min(axis=1)獲得所需的輸出:
left = df.filter(regex=r"[2-7]")
right = df.Col1.to_numpy()[:, None]
booleans = left.to_numpy() > right
left.where(booleans).min(axis = 1)
0.68094
0.68091
0.68089
0.68086
0.68083
我無法很好地復制您的資料(日期列的問題),因此是系列輸出。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/448646.html
標籤:python-3.x 熊猫 麻木的
下一篇:numpy矩陣逆輸入
