2016-07-25 115 views
1

我有一個基於不同的氣象站的數據集,Python的大熊貓 - 刪除基於NaN的組數閾值

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

而且我想刪除「的stationID團體,其中有超過一定數量的NaN更多。舉例來說,如果I型:

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

然後,我想放棄基團具有(至少)一定數量的NaN(比方說30)在組內。據我瞭解,我不能GROUPBY使用dropna(THRESH = 10):

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

那麼,什麼是做與大熊貓的最佳方式是什麼?

回答

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值組

+0

謝謝你的回覆!除溫度外我還有其他變量。因此,使用你的代碼,我將如何考慮NaN的集體總和(即:我想刪除一個組,其中變量1,變量2,變量3,...中的NaN的總和小於閾值) – mmeclimate

+0

@mmeclimate,它的答案不正確/不適合改變問題。你應該問另一個問題,並提供增加的細節。 – Merlin

+0

明白了。我會去做。 – mmeclimate

0

您可以創建一個列給予數通過station_id得到空值,然後使用loc選擇相關數據以供進一步處理。

df['station_id_null_count'] = \ 
    df.groupby('stationID').Temperature.transform(lambda group: group.isnull().sum()) 
df.loc[df.station_id_null_count > 30, :] # Select relevant data 
0

使用@EdChum setup:由於您不提及最終輸出,所以添加了這個。

vals = df.groupby(['id'])['val'].apply(lambda x: (np.size(x)-x.count()) < 2) 

    vals[vals] 

    id 
    0 True 
    2 True 
    Name: val, dtype: bool