我正在研究一個包含數字列和字串列(dtype 為object)的 pandas DataFrame,并希望洗掉包含列內分布的例外值的行。換句話說,檢測每列中的例外值并洗掉相應的行。
我找到了兩種解決方案,但都沒有考慮到我的 df 不只包含數字,因此它們都會導致錯誤(我假設遇到字串時)。
方式1:
from scipy import stats
df[(np.abs(stats.zscore(df)) < 3).all(axis=1)]
回傳TypeError: unsupported operand type(s) for /: 'str' and 'int'。這就是為什么我猜這個錯誤是由具有混合資料型別的 df 引起的。
方式2:
for col in df.columns:
lower = df[col].quantile(0.05)
upper = df[col].quantile(0.95)
df = df[col].clip(lower=lower, upper=upper)
回傳KeyError此回溯:
File omissis, in Class.remove_outliers(self, df)
423 def remove_outliers(self, df):
424 for col in df.columns:
--> 425 lower = df[col].quantile(0.05)
426 upper = df[col].quantile(0.95)
427 df = df[col].clip(lower=lower, upper=upper)
File omissis, in Series.__getitem__(self, key)
955 return self._values[key]
957 elif key_is_scalar:
--> 958 return self._get_value(key)
960 if is_hashable(key):
961 # Otherwise index.get_value will raise InvalidIndexError
962 try:
963 # For labels that don't resolve as scalars like tuples and frozensets
File omissis, in Series._get_value(self, label, takeable)
1066 return self._values[label]
1068 # Similar to Index.get_value, but we do not fall back to positional
-> 1069 loc = self.index.get_loc(label)
1070 return self.index._get_values_for_loc(self, loc, label)
File omissis, in RangeIndex.get_loc(self, key, method, tolerance)
387 raise KeyError(key) from err
388 self._check_indexing_error(key)
--> 389 raise KeyError(key)
390 return super().get_loc(key, method=method, tolerance=tolerance)
KeyError: 'colname'
你會如何解決這個問題?
編輯:想法是跳過非數字列,忽略它們。
uj5u.com熱心網友回復:
我會將問題分為幾個階段:
首先,確定要洗掉例外值的(數字)列。 參考
newdf = df.select_dtypes(include=np.number)
現在對newdf. 之后,newdf應該只包含您希望保留的行。
然后只保留df那些索引的行在newdf. 參考
df = df[df.index.isin(newdf.index)]
uj5u.com熱心網友回復:
@Ipounng 在復制粘貼就緒代碼中的解決方案:
def remove_outliers(df):
newdf = df.select_dtypes(include=np.number)
newdf = newdf[(np.abs(stats.zscore(newdf)) < 3).all(axis=1)]
df = df[df.index.isin(newdf.index)]
return df
uj5u.com熱心網友回復:
除了@lpounng 解決方案。對于分類變數,您不能使用 zscore,但您可以將低值類視為例外值。您可以為值計數設定閾值。
玩具資料集的示例:
import random
import pandas as pd
colors = []
for i in range(100):
colors.append(random.choices(['yellow','white', 'red'], weights = [10, 1, 2])[0])
df = pd.DataFrame(colors, columns=['colors'])
我隨機生成一個帶有黃色、白色和紅色分類值的列,權重為 10、1、2。
使用value_count()pandas 方法,您可以計算列中唯一類別的計數
df['colors'].value_counts()
>>> yellow 68
red 20
white 12
Name: colors, dtype: int64
現在您可以設定閾值并洗掉人口稀少的類別,例如我們白人。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/466663.html
上一篇:使用loc和iloc熊貓設定值
下一篇:Pandas-合并資料框以保留左側的所有值,如果“左側沒有鍵”,則從右側“插入”值,否則“更新”左側的現有“鍵”
