2016-07-25 27 views
1

Ich habe einen Datensatz basierend auf verschiedenen Wetterstationen,Python Pandas - Gruppen entfernen basierend auf NaN zählen Schwelle

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

Und ich möchte Gruppen ‚stationID‘ entfernen, die mehr als eine bestimmte Anzahl von NaNs haben . Zum Beispiel, wenn ich tippe:

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

dann würde Ich mag Gruppen fallen, die (zumindest) eine bestimmte Anzahl von NaNs (etwa 30) innerhalb einer Gruppe. Wie ich es verstehe, kann ich nicht dropna (drischt = 10) mit groupby verwenden:

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

Also, was wäre der beste Weg sein, mit Pandas zu tun?

Antwort

1

IIUC können Sie tun df2.loc[df2.groupby('station')['Temperature'].filter(lambda x: len(x[pd.isnull(x)]) < 30).index]

Beispiel:

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 

So wird dies die Gruppen herauszufiltern, die mehr als 1 nan haben Werte

+0

Vielen Dank für die Antwort! Ich habe andere Variablen als die Temperatur. Also, unter Verwendung Ihres Codes, wie würde ich die kollektive Summe von NaNs berücksichtigen (dh: Ich möchte eine Gruppe entfernen, wo die kollektive Summe von NaNs in Variable1, Variable2, Variable3, ... kleiner ist als ein Schwellenwert) – mmeclimate

+0

@mmeclimate, es ist nicht fair/Recht, die Frage zu ändern, nachdem es beantwortet wurde. Sie sollten eine andere Frage stellen und die zusätzlichen Details angeben. – Merlin

+0

Bekam es. Ich werde das machen. – mmeclimate

0

Sie eine Spalte erstellen, die die Nummer geben NULL-Werte von Station_id, und verwenden Sie dann loc, um die relevanten Daten für die weitere Verarbeitung auszuwählen.

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

Verwendung von @EdChum Setup: Da Sie nicht Ihre endgültige Ausgabe erwähnen, fügen Sie dies hinzu.

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 
Verwandte Themen