【问题标题】:pandas dataframe remove outliers from subgroup of the columns熊猫数据框从列的子组中删除异常值
【发布时间】:2020-07-26 11:43:39
【问题描述】:

我有一个包含 50 个数字列和 10 个分类列的数据框。

df = C1 C2 .. C10 N1 N2 ... N50
     a  b      c   2 3      1

我想删除所有异常值,但仅限于列 N1,N2,N6,N8,N10。 这意味着我不想在任何列中保留所有不是异常值的数据。 最好的方法是什么?

【问题讨论】:

  • 异常值是什么意思?
  • @YOBEN_S 假设高于/低于平均值 3 个标准
  • @M-Wi 否,因为我只想按列的子组过滤
  • 该线程上的至少一些答案涉及指定过滤列。

标签: python pandas data-science outliers


【解决方案1】:

尝试以下任何一种:

1) 循环选择和删除行:

test_cols = ['N1','N2','N6','N8','N10']

for c in test_cols:
    drop_rows = df[(((df[c] - df[c].mean()) / df[c].std()).abs() < 3)].index
    df = df.drop(drop_rows)

2) 合并 drop_rows 索引并一次性删除所有索引:

drop_set = {}
for c in test_cols:
    drop_ind = df[(((df[c] - df[c].mean()) / df[c].std()).abs() < 3)].index
    drop_set = {*drop_set, *drop_ind}
df = df.drop(drop_set)

3) 具有复杂的选择条件并立即删除选定的行。或者。

drop_rows = df[(((df['N1'] - df['N1'].mean()) / df['N1'].std()).abs() < 3) |
               (((df['N2'] - df['N2'].mean()) / df['N2'].std()).abs() < 3) |
               (((df['N6'] - df['N6'].mean()) / df['N6'].std()).abs() < 3) |
               (((df['N8'] - df['N8'].mean()) / df['N8'].std()).abs() < 3) |
               (((df['N10'] - df['N10'].mean()) / df['N10'].std()).abs() < 3)].index
df = df.drop(drop_rows)

2) 和 3) 应该比 1) 快

【讨论】:

  • @Rusian 不是没有循环的方法吗?会不会更优雅?
  • 如果 'N1','N2','N6','N8','N10' 是布尔值,那么使用 any() 函数可以提供一个很好的干净解决方案。为避免循环,您可以使用复杂条件。查看我的答案已更新。接受吗?
猜你喜欢
  • 2018-01-09
  • 1970-01-01
  • 2018-02-24
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多