2015-05-27 8 views
7

Also ich Pandas Datenrahmen haben, die wie folgt aussieht:Python Pandas: ausschließen Zeilen unterhalb einer bestimmten Frequenz Zahl

r vals positions 
1.2  1 
1.8  2 
2.3  1 
1.8  1 
2.1  3 
2.0  3 
1.9  1 
...  ... 

Ich möchte den Filter alle Zeilen von Position, die mindestens 20 Mal nicht angezeigt werden. Ich habe so etwas wie diese

g=df.groupby('positions') 
g.filter(lambda x: len(x) > 20) 

gesehen, aber dies scheint nicht zu arbeiten, und ich verstehe nicht, wie den ursprünglichen Datenrahmen von diesem zurück zu bekommen. Vielen Dank im Voraus für die Hilfe.

+0

Entschuldigen Sie, dass Sie 'r vals' filtern, die nicht mindestens 20 mal vorkommen oder die Sie Positionen filtern möchten, die nicht 20 eindeutige r vals haben? – EdChum

Antwort

17

Auf Ihrem begrenzten Datensatzes die folgenden Werke:

In [125]: 
df.groupby('positions')['r vals'].filter(lambda x: len(x) >= 3) 

Out[125]: 
0 1.2 
2 2.3 
3 1.8 
6 1.9 
Name: r vals, dtype: float64 

Sie das Ergebnis dieses Filters zuweisen und diese verwenden, um mit isin filter your orig df:

In [129]: 
filtered = df.groupby('positions')['r vals'].filter(lambda x: len(x) >= 3) 
df[df['r vals'].isin(filtered)] 

Out[129]: 
    r vals positions 
0  1.2   1 
1  1.8   2 
2  2.3   1 
3  1.8   1 
6  1.9   1 

Sie müssen nurändern-20 in Ihrem Fall

Ein anderer Ansatz wäre value_counts verwenden ein Aggregat Serie zu erstellen, können wir dann so Ihre df zu filtern:

In [136]: 
counts = df['positions'].value_counts() 
counts 

Out[136]: 
1 4 
3 2 
2 1 
dtype: int64 

In [137]: 
counts[counts > 3] 

Out[137]: 
1 4 
dtype: int64 

In [135]: 
df[df['positions'].isin(counts[counts > 3].index)] 

Out[135]: 
    r vals positions 
0  1.2   1 
2  2.3   1 
3  1.8   1 
6  1.9   1 

EDIT

Wenn Sie möchten, Um das groupby-Objekt auf dem Datenframe anstatt einer Serie zu filtern, können Sie filter direkt auf dem groupby-Objekt aufrufen:

In [139]: 
filtered = df.groupby('positions').filter(lambda x: len(x) >= 3) 
filtered 

Out[139]: 
    r vals positions 
0  1.2   1 
2  2.3   1 
3  1.8   1 
6  1.9   1 
+0

Danke, funktioniert perfekt. Ich möchte den vollständigen Datenrahmen, aber so habe ich ['r vals'] aus Ihrer Zeile entfernt. Prost! –

0

Wie über alle position Zeilen mit Werten von> = 20 Auswahl

mask = df['position'] >= 20 
sel = df.ix[mask, :] 
+0

Das OP fragt nach einem Filter von Positionen nach Anzahl statt Wert – EdChum

+0

Ich denke, Sie haben die Frage falsch verstanden. Ich möchte die Zeilen mit der Position z. B. gleich 1 zählen und dann alle diese Zeilen entfernen, wenn die Anzahl <20 ist. Es spielt keine Rolle, was der Wert der Position ist, nur die Anzahl der Zeilen, die diese enthalten Wert. Entschuldigung für die Verwirrung. –

+0

Entschuldigung, und die nicht hilfreiche Antwort. –

Verwandte Themen