pandas dataframe 从列的子组中删除异常值
pandas dataframe remove outliers from subgroup of the columns
我有一个包含 50 个数字列和 10 个分类列的数据框。
df = C1 C2 .. C10 N1 N2 ... N50
a b c 2 3 1
我想删除所有异常值,但只从列 N1,N2,N6,N8,N10
中删除。
这意味着我不想在任何一个专栏中保留所有不是异常值的词。
最好的方法是什么?
试试这些:
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)
快
我有一个包含 50 个数字列和 10 个分类列的数据框。
df = C1 C2 .. C10 N1 N2 ... N50
a b c 2 3 1
我想删除所有异常值,但只从列 N1,N2,N6,N8,N10
中删除。
这意味着我不想在任何一个专栏中保留所有不是异常值的词。
最好的方法是什么?
试试这些:
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)
快