【问题标题】:How to access values in another column of a panda dataframe如何访问熊猫数据框另一列中的值
【发布时间】: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 重数据集一起使用的问题。

标签: python pandas


【解决方案1】:

注意,你可以用percentile计算四分位间距:

In [21]: d
Out[21]:
        Salary  Sex
Joe          1    0
Steph    20000    1
Jared        5    0
Oliver    1000    0
Gaby      3000    1

In [22]: iqr = d.Salary.quantile([.25,.75]).values

In [23]: iqr
Out[23]: array([    5.,  3000.])

然后,您可以使用逐元素布尔运算:

In [24]: (d.Salary < iqr[0]) | (d.Salary > iqr[1])
Out[24]:
Joe        True
Steph      True
Jared     False
Oliver    False
Gaby      False
Name: Salary, dtype: bool

最后,您可以将结果用于整个数据框的选择:

In [26]: d[(d.Salary < iqr[0]) | (d.Salary > iqr[1])]
Out[26]:
       Salary  Sex
Joe         1    0
Steph   20000    1

或者类似的东西。我不记得 Tukey 异常值的具体细节。但是使用上面说明的方法应该很容易处理。

好的,这是你使用 Tukey 测试所需要的:

In [40]: IQR = iqr[1] - iqr[0]

In [41]: upper = 1.5*IQR+iqr[1]

In [42]: lower = iqr[0] - 1.5*IQR

In [43]: (d.Salary < lower) | (d.Salary > upper)
Out[43]:
Joe       False
Steph      True
Jared     False
Oliver    False
Gaby      False
Name: Salary, dtype: bool

In [44]: d[(d.Salary < lower) | (d.Salary > upper)]
Out[44]:
       Salary  Sex
Steph   20000    1

要获取女性的数量,您可以使用sum

In [46]: d[(d.Salary < lower) | (d.Salary > upper)]['Sex'].sum()
Out[46]: 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 2017-04-14
    • 2021-06-25
    • 2018-01-01
    • 2022-01-23
    • 2021-07-15
    相关资源
    最近更新 更多