暫時這裏是一個幾乎完美的解決方案。問題是,當你想計算多個匹配的平均值(比如說,一行中的所有三個數字都接近閾值)時,你需要在計算平均值時取適當數量的值。如果3列中只有1或3個匹配,這很容易。但是,當兩對數字「接近」但第三對不是時,下面的代碼將會出現錯誤。
這個想法是總結每行和每個組合的匹配值。例如,如果只有行'A'
和'B'
「接近」(在閾值內),我們得到df.A+df.B
,其必須除以2以得到平均值。當所有三個「接近」時,我們得到2*df.A + 2*df.B + 2*df.C
,其可以被6除以得到適當的平均值。但是,在第三種情況下,例如,我們得到df.A + 2*df.B + df.C
(當A和B接近時,B和C接近,但A和C不接近)。在這種情況下,我們不能用任何東西來劃分,以獲得適當的意思。我們可能應該用4除以得到「大約一個」元素的錯誤含義。我的觀點是,如果我們要妥善處理這種情況,那麼代碼會複雜得多,根據您的需要,這可能不值得。目前還不清楚你要如何處理這個案件。當前版本除以4,相當於平均A與B,平均B與C,然後再次平均這些平均值。
所以這裏有雲:
import numpy as np
import pandas as pd
from itertools import combinations
colnames = ['A', 'B', 'C']
df = pd.DataFrame(np.random.randn(12, 3), columns=colnames)
thresh = .3
df['matches'] = sum(abs(df[k1]-df[k2])<thresh
for k1,k2 in combinations(colnames,2))
# this is your starting point, we'll need df['matches'] too
tmpsums = sum(np.where(abs(df[k1]-df[k2])<thresh,df[k1]+df[k2],0)
for k1,k2 in combinations(colnames,2))
# divide by 2/4/6:
df['matches_mean'] = np.where(df['matches'],tmpsums/df['matches']/2,0)
在發電機表達的出現總和達到口感好等限制,我承認。你可能想把它寫在適當的for循環中,但是你必須遞增地總結tmpsums
中的值。我承認這可能更漂亮。
無論如何,這第二個生成器表達式的工作方式與第一個類似。該產生價值當然是不同的,它是
np.where(abs(df[k1]-df[k2])<thresh,df[k1]+df[k2],0)
也就是說,它會給我們給定的列對,如果這些值比脫粒接近的元素的總和,否則我們得到0。對於所有3組合我們得到一個具有這樣的零或者兩個和的元素值的數組,並且我們再次總結它們。在有0個匹配的情況下,我們得到0.如果有1個匹配,我們總結兩個匹配元素。對於2場比賽,我們得到了前面提到的混合總和,並且在3場比賽中我們有兩次所有術語。
剩下的是將非零例除以匹配的數量,這只是一個分割,其中我們已經知道的匹配數量是兩倍(但我們必須注意零除)。
實施例輸出與thresh = 0.3
:
A B C matches matches_mean
0 0.716278 0.681279 0.861410 3 0.752989
1 -0.109029 -0.646952 0.268038 0 0.000000
2 -1.095221 -1.088397 1.100645 1 -1.091809
3 -1.970372 -0.367096 -0.337098 1 -0.352097
4 -1.030003 0.082001 -0.807431 1 -0.918717
5 1.660611 -0.046429 0.557107 0 0.000000
6 -0.508715 -0.588217 0.014917 1 -0.548466
7 0.578028 -0.187097 -0.420243 1 -0.303670
8 0.233687 1.311917 1.888947 0 0.000000
9 0.478863 1.087957 -0.897025 0 0.000000
10 -0.001462 0.866320 -1.198642 0 0.000000
11 0.297946 0.564325 -1.098887 1 0.431135
如果多於一對列的接近什麼?該專欄應包含哪些內容? –
你好安德拉斯。我最終尋找大多數比賽以及這場比賽的平均數。所以如果3列匹配並且2匹配來自同一行,那麼3列的平均值將是理想的。謝謝你的幫助! – ade1e
那麼沒有匹配的行呢? –