我已經搜索了一些關于此的先前答案,但我想進一步了解一件事。
這是測驗資料:
df = pd.DataFrame({"a":[2,3,4,5,6,8],"b":[3,4,np.nan,6,111,22], "c" : [2,3,4,5, 777,1]})
這是我正在使用的檢查值是否每列的例外值
def check_outliers(df, domain_list):
outlier_column = []
for domain in domain_list:
Q1 = df[domain].quantile(0.25)
Q3 = df[domain].quantile(0.75)
IQR = Q3 - Q1
min_v = Q1 - (1.5 * IQR)
max_v = Q3 (1.5 * IQR)
df["No_outliers_" domain] = np.where(np.isnan(df[domain]),"-",np.where((df[domain] >= min_v) & (df[domain] <= max_v), "O",domain))
outlier_column.append("No_outliers_" domain)
#df["No_outliers"] = np.where()
df = df.drop(outlier_column, axis=1)
return df
df = check_outliers(df,["a","b","c"])
我看到很多人建議使用np.whereor np.select,但我想知道更多的是為條件處理多個列。如果列的值是例外值,我想制作包含列名的“No_outliers”列。還有“-”表示標記np.nan值。
所以它應該有,"No_outliers" : ["","","b","","b, c",""]因為111incolumn "b"和777incolumn "c"將是每列中的例外值。
我想我可以.any()在這里使用,但我不能。我一定是以錯誤的方式使用它。
希望你能幫我解決這個問題。
謝謝!
uj5u.com熱心網友回復:
我們可以使用邏輯組合多個布爾掩碼OR以創建結果掩碼,其中 True 值表示例外值,然后將此掩碼與列的點積并將結果分配給No_outliers列
mask = df[domain].lt(min_v) | df[domain].gt(max_v) | df[domain].isna()
df['No_outliers'] = (mask @ (mask.columns ', ')).str[:-2]
結果
print(df)
a b c No_outliers
0 2 3.0 2
1 3 4.0 3
2 4 NaN 4 b
3 5 6.0 5
4 6 111.0 777 b, c
5 8 22.0 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/429568.html
標籤:python-3.x 熊猫 数据框
下一篇:索引字串沒有isin()方法
