【问题标题】:Filter anomalous and complex datasets过滤异常和复杂的数据集
【发布时间】:2020-10-11 18:41:58
【问题描述】:

我有一个关于如何从大型 df 中过滤和选择异常数据集的问题。例如,我有一个 df:

import pandas as pd
import numpy as np

data = {"code": ['a', 'a', 'a', 'b', 'b', 'c', 'c', 'c', 'd', 'd'],
"number": [7, 5, 2, 4, 6, 9, 6, 2, 8, 2]}

df = pd.DataFrame(data=data)

  code  number
0    a       7
1    a       5
2    a       2
3    b       4
4    b       6
5    c       9
6    c       6
7    c       2
8    d       8
9    d       2

在这个df中,大部分数据遵循一个规则,在同一个'code'组中,一个更大的数字出现在开头。例如,在“a”组中,它在数据框中的值如下:7>5>2;在'c'组中,它的值如下:9>6>2,在'd'组中相同的模式8> 2。但不是在'b'组中,因为较小的值4排列在6之前。所以我希望过滤仅异常子集 b 并具有如下输出:

  code  number
0    b       4
1    b       6

有人有什么想法吗?非常感谢您的帮助。

【问题讨论】:

    标签: python pandas dataframe filter


    【解决方案1】:

    我们可以使用filter 然后使用diff

    df.groupby('code').filter(lambda x : (x.number.diff()>0).any())                        
      code  number
    3    b       4
    4    b       6
    

    【讨论】:

    • 非常感谢@YOKEN_S,你的代码更像pythonic
    • @Alicejinx yw:-) 快乐编码
    • 嗨@YOBEN_S,我再次查看了您的代码,它非常完美。但是我有点困惑,为什么最后是 any() 函数,那是为了什么?请原谅我的无知,因为您的代码对我来说太好学了。非常感谢。
    • @Alicejinx 如果任何差异大于该组的 0,将返回 True ~
    【解决方案2】:
    print( df[df.code.isin(df[df.groupby('code')['number'].transform(lambda x: x - x.shift()) > 0].code)] )
    

    打印:

      code  number
    3    b       4
    4    b       6
    

    【讨论】:

    • 谢谢@Andrej Kesely,你的回答太好了。只是想知道 shift() 函数的默认参数或周期是什么?
    • @Alicejinx 根据documentation1。默认是向下一个位置
    【解决方案3】:
    df[df.groupby('code')['number'].apply(lambda x: (x.sub(x.shift(-1).fillna(0))<0)|((x.shift(1).sub(x).fillna(0))<0))]
    
       code  number
    3    b       4
    4    b       6
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-23
      • 2022-11-05
      • 2020-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多