我有一些销售数据,例如,想看看邮编的不同之处:有些公司提供的利润比其他公司更多?因此,我按邮政编码分组,并且可以轻松地按每个邮政编码获取各种统计信息。但是,有一些非常高价值的工作会扭曲统计数据,因此我想做的就是忽略异常值。由于各种原因,我想按组定义离群值:例如,删除数据框中位于其组的第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
掉落整个组,而不是部分组。
我想我可以遍历各个组,然后为每个组找出要删除的行,然后返回到原始数据帧并删除它们,但这看起来非常笨拙。有没有更好的办法?
您可以使用apply()
方法:
import pandas as pd
import io
txt=""" 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"""
df = pd.read_csv(io.BytesIO(txt), delim_whitespace=True, index_col=0)
def f(df):
return df.sort("C").iloc[:-2]
df2 = df.groupby("A", group_keys=False).apply(f)
print df2
输出:
A C D
5 bar -0.346749 -0.127740
4 foo -0.910537 -1.634047
7 foo -0.640706 2.635910
0 foo -0.536732 0.061055
如果要原始订单:
print df2.reindex(df.index[df.index.isin(df2.index)])
输出:
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
获得高于组均值的行:
def f(df):
return df[df.C>df.C.mean()]
df3 = df.groupby("A", group_keys=False).apply(f)
print df3
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句