![](/img/trans.png)
[英]PySpark DataFrame: Find closest value and slice the DataFrame
[英]Find the value closest to median in a dataframe
幾個月前我剛拿起 python 並且是這個論壇的新手。 感謝是否有人可以提供幫助。 我想找到最接近中位數的值。
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.