【发布时间】:2016-12-01 20:01:37
【问题描述】:
假设我有一个数据框:
d = pd.DataFrame({'Salary' : pd.Series([1, 20000, 5, 1000, 3000],
index = ['Joe', 'Steph', 'Jared', 'Oliver', 'Gaby']),
'Sex' : pd.Series([0, 1, 0, 0, 1],
index=['Joe', 'Steph', 'Jared', 'Oliver', 'Gaby'])})
Salary Sex
Joe 1 0
Steph 20000 1
Jared 5 0
Oliver 7000 0
Gaby 3000 1
我编写了一个函数,它以列名作为参数,计算值的四分位数范围并基于此返回异常值的数量。如果我还希望该函数返回工资异常值的女性人数,我如何访问“性别”列以检查异常工资的相应“性别”值?
这是我的异常值函数:
def iqr_outliers(num_df, column):
nan_count = 0
for value in column:
if value == 'NaN':
nan_count += 1
cleaned_column = [x for x in column if str(x) != "NaN"]
iqr = np.subtract(*np.percentile(cleaned_column, [75, 25]))
upper = np.percentile(cleaned_column, 75) + 1.5 * iqr
lower = np.percentile(cleaned_column, 25) - 1.5 * iqr
outliers = []
lows = 0
highs = 0
fem_outliers= 0
for value in cleaned_column:
if value < lower:
lows += 1
outliers.append(value)
elif value > upper:
highs += 1
outliers.append(value)
return ({"Number of low outliers": lows, "Number of high outliers": highs, "Number of NaNs": nan_count})
我想在 if 语句中的某个地方检查同一行的 'sex' 的值,但我真的不知道如何访问它。
【问题讨论】:
-
您使用的
pandas错误。请参阅我的回答,了解您应该如何处理这些事情。 -
谢谢@juanpa.arrivillaga。我对整个事情都很陌生。我担心的一件事是
d.Salary.quantile([.25,.75])将如何处理 NaN,我似乎记得关于它们只是被放在列表末尾的一些事情。你知道吗? -
我似乎记得
quantile不适合 NaN。通常,对于大多数 pandas 方法,默认情况下会忽略 NaN。您可能可以使用.dropna来处理它 -
是的,分位数实际上并不好。但是,我所有的专栏(包括薪水)都有 NaN,所以
.dropna不能正常工作。 'fillna(0)' 不是一个选项,因为这会大大扭曲四分位数的位置。所以我想这确实是一个如何将分位数与 NaN 重数据集一起使用的问题。