我有一个混合数据框,有str、int和float类型。我在float列中有一些离群值,我试着用以下方法将它们替换为NaN。
df.mask(df.sub(df.mean()).div(df.std()).abs().gt(2))
我也试过用numpy的
v = df.values
mask = np.abs((v - v.mean(0)) / v.std(0)) > 2
pd.DataFrame(np.where(mask, np.nan, v), df.index, df.columns)`
但对于这两个人,我都得到了 TypeError: unsupported operand type(s) for -: 'str' and 'float'
和 TypeError: must be str, not float
我也试着只对有离群值的列应用这个功能,但它没有修改任何东西。
这就是DF的样子
dateRep cases deaths countriesAndTerritories countryterritoryCode popData2018
0 03/05/2020 134.0 4.0 Afghanistan AFG 37172386.0
1 02/05/2020 164.0 4.0 Afghanistan AFG 37172386.0
2 01/05/2020 222.0 NaN Afghanistan AFG 37172386.0
3 30/04/2020 122.0 0.0 Afghanistan AFG 37172386.0
4 29/04/2020 124.0 3.0 Afghanistan AFG 37172386.0
你可以试试这样的方法(这是为了改变 "案例 "列)。
df.loc[abs(df.cases - df.cases.mean())/df.cases.std() > 1, "cases"] = None
但是,请注意,这里我对 "Cases "列使用了1的Z值,因为最大的Z值是1.63(index=2的实例)。你是想修改Z值大于2的值,这些实例的Z值都不大于2。
希望能帮到你!