簡體   English   中英

在 dataframe 中找到最接近中位數的值

[英]Find the value closest to median in a dataframe

幾個月前我剛拿起 python 並且是這個論壇的新手。 感謝是否有人可以提供幫助。 我想找到最接近中位數的值。

  1. 為了獲得每個單元的中位數,我使用 groupby 和 median()。
  2. 然后得到與原廠dataframe的區別
  3. 使用 abs() 和 idxmin() 來獲得最小的增量。 基本上我最終得到另一個 dataframe ,它的索引值最接近中位數。 如何繼續使用索引來獲取實際值?
Unit    Test1   Test2   Test3
Unit1   0.254279388 0.010388754 0.820704593
Unit1   0.957139807 0.207681463 0.738428693
Unit1   0.043462803 0.154220478 0.606568744
Unit2   0.044308884 0.134817932 0.697317637
Unit2   0.244895686 0.909262442 0.153881824
Unit3   0.368147792 0.735655648 0.200679595
Unit3   0.30457518  0.929519313 0.823938759
Unit3   0.537633836 0.661168043 0.736937724
Unit3   0.410137495 0.567494043 0.68300754
Unit3   0.525483757 0.556830631 0.988314575

Unit    Test1   Test2   Test3
Unit1   0.254279388 0.154220478 0.738428693
Unit2   0.144602285 0.522040187 0.425599731
Unit3   0.410137495 0.661168043 0.736937724

這是代碼片段。 每列都應該有自己的索引,但 iloc 使用所有列的第一個索引

DATA_MEDIAN = DATA.groupby('Unit').median()

DATA_INDEX = (DATA.set_index(['Unit']) - DATA_MEDIAN).abs().reset_index().groupby('Unit').idxmin()

DATA_INDEX.reset_index(就地=真)

DATA_CLOSEST = DATA.iloc[DATA_INDEX.index]

這是一個解決方案。 請注意,對於只有兩行的單位,選擇最接近平均值的值是任意的。

t = df.melt(id_vars="Unit")
t["distance_from_mean"] = t.groupby(["Unit", "variable"]).transform("mean").subtract(t.value, axis=0).abs()

t = t.loc[t.groupby(["Unit", "variable"], as_index=False)["distance_from_mean"].idxmin()]

res = pd.pivot_table(t, columns="variable", index = "Unit", values="value")
print(res)

output 是:

variable     Test1     Test2     Test3
Unit                                  
Unit1     0.254279  0.154220  0.738429
Unit2     0.044309  0.134818  0.153882
Unit3     0.410137  0.661168  0.683008

如果某些單元對於給定的測試只有 NaN 值,則需要稍微修改代碼。 見下文(以此類數據框為例):

df = pd.DataFrame({
    "Unit": ["Unit1"] * 3 + ["Unit2"] * 2 + ["Unit3"] * 5, 
    "Test1": range(10), 
    "Test2": range(10, 20), 
    "Test3": range(20,30)
})
df.loc[3:4, "Test2"] = np.NaN
print(df)

==>
    Unit  Test1  Test2  Test3
0  Unit1      0   10.0     20
...
3  Unit2      3    NaN     23
4  Unit2      4    NaN     24
5  Unit3      5   15.0     25
...

您正在尋找的代碼:

t = df.melt(id_vars="Unit")
t["distance_from_mean"] = t.groupby(["Unit", "variable"]).transform("mean").subtract(t.value, axis=0).abs()

indices = t.groupby(["Unit", "variable"], as_index=False)["distance_from_mean"].idxmin()
indices.dropna(inplace = True)

t = t.loc[indices]

res = pd.pivot_table(t, columns="variable", index = "Unit", values="value")
print(res)

==>

variable  Test1  Test2  Test3
Unit                         
Unit1       1.0   11.0   21.0
Unit2       3.0    NaN   23.0
Unit3       7.0   17.0   27.0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM