一尘不染

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

python

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

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...*

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


阅读 233

收藏
2021-01-20

共1个答案

一尘不染

你可以做的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值的组

2021-01-20