我有一些和销售相关的数据,并想查看不同邮编之间的比较:是否有些邮编提供的业务比其他邮编更加有利可图?因此,我按邮编对数据进行分组,并可以轻松地获得每个邮编的各种统计数据。然而,有一些非常高价值的工作会扭曲统计数据,因此我想要忽略这些异常值。出于各种原因,我希望通过分组来定义异常值:例如,在数据框中删除分组中处于前X个百分位或前N个的行。
因此,如果我有以下数据框:
>>> df
Out[67]:
A C D
0 foo -0.536732 0.061055
1 bar 1.470956 1.350996
2 foo 1.981810 0.676978
3 bar -0.072829 0.417285
4 foo -0.910537 -1.634047
5 bar -0.346749 -0.127740
6 foo 0.959957 -1.068385
7 foo -0.640706 2.635910
我希望能够有一个函数,比如drop_top_n(df, group_column, value_column, number_to_drop)
,其中drop_top_n(df, "A", "C", 2)
将返回:
A C D
0 foo -0.536732 0.061055
4 foo -0.910537 -1.634047
5 bar -0.346749 -0.127740
7 foo -0.640706 2.635910
使用filter
会删除整个组,而不是组的部分。
我猜想可以通过迭代组,并为每个组找出要删除的行,然后返回到原始数据框并删除它们,但那似乎非常笨拙。有更好的方法吗?