我有一個相對較大的資料框(~24000 行和 15 列),其中包含由神經網路 (DeepLabCut) 輸出的大鼠運動的 2D 坐標資料。
作為此輸出資料的一部分,有一個 p 值分數,用于衡量應用該標簽時神經網路的確定性。我試圖通過將前一行復制到它的位置來過濾低質量預測,每次遇到低 p 值時,假設老鼠在該幀保持靜止。
到目前為止,這是我的功能:
def checkPVals(DataFrame, CutOff):
for Cols in DataFrame.columns.values:
if Cols % 3 == 0:
for Vals in DataFrame.index.values:
if float(DataFrame[Cols][Vals]) < CutOff:
if (Vals != 0):
PreviousRow = DataFrame.loc[Vals - 1, Cols - 3:Cols]
DataFrame.loc[Vals, Cols - 3:Cols] = PreviousRow
return(DataFrame)
以下是輸入資料框的示例:
pd.DataFrame(data={
"x":[1, 2, 3, 4],
"y":[5, 4, 3, 2],
"likelihood":[1, 1, 0.3, 1]
})
以下是所需輸出的示例:
x y Pval
0 1 5 1.0
1 2 4 1.0
2 2 4 1.0
3 4 2 1.0
想法是將行索引 2 替換為來自行索引 1 的值,這樣當計算這些坐標之間的幀間歐幾里得距離時,距離為 0,這意味著標簽 (rat) 沒有移動。
顯然,我目前的實作效率非常低。我正在查看 iterrows(),但這會將我的資料轉換為一個系列并弄亂它。我的另一個想法是將 p 值列轉換為 np.arrrays,遍歷這些列,獲取低于閾值的 p 值的索引,然后以迭代方式交換前一列的行。但是,我覺得這需要同樣長的時間。
很感謝任何形式的幫助。謝謝!
uj5u.com熱心網友回復:
我很確定我明白你想要做什么。如果您可以更新您的問題以獲得與您的樣本輸入配對的樣本輸出,那將是非常有益的。
如果我理解正確,您應該使用矢量化方法而不是顯式回圈(這將大大加快您的資料整理速度)。本質上,您可以根據“可能性”列是否高于某個值來屏蔽資料幀的行。一旦您將低可能性屏蔽掉(即用 NaN 替換這些值),您可以簡單地向前填充整個資料幀以使用前一行的值填充“壞”行。
df = pd.DataFrame(data={
"x":[1, 2, 3, 4],
"y":[5, 4, 3, 2],
"likelihood":[1, 1, 0.3, 1]
})
cutoff = 0.5
new_df = df.mask(df["likelihood"] < cutoff).ffill()
print(new_df)
x y likelihood
0 1.0 5.0 1.0
1 2.0 4.0 1.0
2 2.0 4.0 1.0
3 4.0 2.0 1.0
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/347388.html
上一篇:查找設施數量最多的城市
