Python Pandas-根据NaN计数阈值删除组

发布于 2021-01-29 14:56:39

我有一个基于不同气象站的数据集,

stationID | Time | Temperature | ...
----------+------+-------------+-------
123       |  1   |     30      |
123       |  2   |     31      |
202       |  1   |     24      |
202       |  2   |     24.3    |
202       |  3   |     NaN     |
...

我想删除具有多个NaN的’stationID’组。例如,如果我键入:

**>>> df.groupby('stationID')**

然后,我想删除一个组中至少具有一定数量的NaN(例如30个)的组。据我了解,我不能将dropna(thresh = 10)与groupby一起使用:

**>>> df2.groupby('station').dropna(thresh=30)**
*AttributeError: Cannot access callable attribute 'dropna' of 'DataFrameGroupBy' objects...*

那么,用熊猫做到这一点的最佳方法是什么?

关注者
0
被浏览
112
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    你可以做的IIUC df2.loc[df2.groupby('station')['Temperature'].filter(lambda x: len(x[pd.isnull(x)] ) < 30).index]

    例:

    In [59]:
    df = pd.DataFrame({'id':[0,0,0,1,1,1,2,2,2,2], 'val':[1,1,np.nan,1,np.nan,np.nan, 1,1,1,1]})
    df
    
    Out[59]:
       id  val
    0   0  1.0
    1   0  1.0
    2   0  NaN
    3   1  1.0
    4   1  NaN
    5   1  NaN
    6   2  1.0
    7   2  1.0
    8   2  1.0
    9   2  1.0
    
    In [64]:    
    df.loc[df.groupby('id')['val'].filter(lambda x: len(x[pd.isnull(x)] ) < 2).index]
    
    Out[64]:
       id  val
    0   0  1.0
    1   0  1.0
    2   0  NaN
    6   2  1.0
    7   2  1.0
    8   2  1.0
    9   2  1.0
    

    因此,这将滤除具有大于1 nan值的组



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看