我有一个包含很少列的pandas数据帧.
现在我知道某些行是基于某个列值的异常值.
例如列 - 'Vol'的所有值都大约为12xx,一个值为4000(异常值).
现在我想排除那些有'Vol'列的行.因此,基本上我需要在数据框上放置一个过滤器,以便我们选择所有行,其中某列的值在与平均值相差3个标准差的范围内.
实现这一目标的优雅方式是什么?
假设我有一个pandas数据框df:
我想计算数据框的列方式.
这很简单:
df.apply(average)
Run Code Online (Sandbox Code Playgroud)
然后列方式范围max(col) - min(col).这很容易再次:
df.apply(max) - df.apply(min)
Run Code Online (Sandbox Code Playgroud)
现在对于每个元素,我想减去其列的平均值并除以其列的范围.我不知道该怎么做
任何帮助/指针都非常感谢.
我想对熊猫数据框中的几列数据进行解冻。每列都有一些NaN,这会影响winsorization,因此需要将其删除。我知道如何执行此操作的唯一方法是针对所有数据删除它们,而不是仅逐列删除它们。
MWE:
import numpy as np
import pandas as pd
from scipy.stats.mstats import winsorize
# Create Dataframe
N, M, P = 10**5, 4, 10**2
dates = pd.date_range('2001-01-01', periods=N//P, freq='D').repeat(P)
df = pd.DataFrame(np.random.random((N, M))
, index=dates)
df.index.names = ['DATE']
df.columns = ['one','two','three','four']
# Now scale them differently so you can see the winsorization
df['four'] = df['four']*(10**5)
df['three'] = df['three']*(10**2)
df['two'] = df['two']*(10**-1)
df['one'] = df['one']*(10**-4)
# Create NaN
df.loc[df.index.get_level_values(0).year == 2002,'three'] = np.nan
df.loc[df.index.get_level_values(0).month == 2,'two'] = np.nan
df.loc[df.index.get_level_values(0).month …Run Code Online (Sandbox Code Playgroud)