2016-07-25 121 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