我有一个基于不同气象站的数据集,
stationID | Time | Temperature | ...
----------+------+-------------+-------
123 | 1 | 30 |
123 | 2 | 31 |
202 | 1 | 24 |
202 | 2 | 24.3 |
202 | 3 | NaN |
...
Run Code Online (Sandbox Code Playgroud)
我想删除“ stationID”组,该组的NaN数量超过一定数量。例如,如果我键入:
**>>> df.groupby('stationID')**
Run Code Online (Sandbox Code Playgroud)
然后,我想删除组中至少具有一定数量的NaN(例如30个)的组。据我了解,我不能将dropna(thresh = 10)与groupby一起使用:
**>>> df2.groupby('station').dropna(thresh=30)**
*AttributeError: Cannot access callable attribute 'dropna' of 'DataFrameGroupBy' objects...*
Run Code Online (Sandbox Code Playgroud)
那么,用熊猫做到这一点的最佳方法是什么?
你可以做的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
Run Code Online (Sandbox Code Playgroud)
因此,这将滤除具有1个以上nan值的组