2016-09-28 2 views
1

Ich bin sehr neu in Pandas und hoffe, dass mir zumindest jemand in die richtige Richtung zeigen kann.Filter Datenrahmen von Werten in verschiedenen Spalten Pandas

Hier kommt die eigentliche Frage:

df:

  time    Area  lon  lat  mode   ID 
    1993-08-01 00:34:28   A 45.627800 34.733400  false  3183 
    1993-08-01 00:34:28   A 45.699600 34.639300  false  3183 
    1993-08-01 00:34:28   A 45.603800 34.730600  false  3183 
    1992-03-21 01:13:18   A 45.686400 34.548100  false  3184 
    1992-03-21 01:13:18   A 45.702400 34.554300  false  3184 
    1992-03-21 01:13:18   B 45.304784 34.626540  NaN  3184 
    1992-03-21 16:13:20   A 45.633800 34.709700  false  3185 
    1992-03-21 16:13:20   A 45.643400 34.709000  true  3185 
    1992-03-21 16:13:20   A 45.634600 34.959500  true  3185 

Ich möchte alle Instanzen 'ID', um herauszufiltern, die nur Daten von einem 'Area' hat (entweder A oder B). Die ‚ID‘ s Ich möchte muss also mindestens eine Instanz von ‚A‘UND‚B‘ in einem neuen Datenrahmen gespeichert werden.

Von df präsentierte unten nach oben nur das entires präsentiert paßt die constrain:

1992-03-21 01:13:18   A 45.686400 34.548100  false  3184 
    1992-03-21 01:13:18   A 45.702400 34.554300  false  3184 
    1992-03-21 01:13:18   B 45.304784 34.626540  NaN  3184 

Gerade jetzt, um zu versuchen Ich bin über einen regelmäßigen for-Schleife mit if-Anweisungen und eine Liste zu Zwischenspeichern ‚Area zu tun ' Attribute für jede ' ID '. Das fühlt sich wie eine sehr schlechte Herangehensweise an und es muss einige idiomatische Pandas geben.

+0

Warum in der Ausgabe fehlt '1992-03-21 01:13:18 A 45.686400 34.548100 false 3184'? – jezrael

+0

Ich verstehe nicht, was du meinst? Die letzten zwei Zeilen sind die gewünschten, da sie die einzigen Einträge sind, die eine eindeutige 'ID' teilen und sowohl Bereich A als auch B – PigFoot

+0

Hmm enthalten, aber Bereich 'A' hat zwei Reihen mit 'ID = 3184' und 'B' einziger. Also warum in der Ausgabe ist nur eine Zeile aus der Kategorie "A" und nicht beide wie in meiner Antwort unten? – jezrael

Antwort

0

Ich glaube, Sie brauchen pivot_table mit dropna für alle Werte zu entfernen, die nicht in allen Gruppen sind:

print (df.pivot_table(index='Area', columns='ID', values='lat').dropna(axis=1)) 
ID  3184 
Area   
A  34.55120 
B  34.62654 

vals = df.pivot_table(index='Area', columns='ID', values='lat').dropna(axis=1).columns 
print (vals) 
Int64Index([3184], dtype='int64', name='ID') 

Letzte Verwendung boolean indexing mit isin:

print (df[df.ID.isin(vals)]) 
        time Area  lon  lat mode ID 
3 1992-03-21 01:13:18 A 45.686400 34.54810 False 3184 
4 1992-03-21 01:13:18 A 45.702400 34.55430 False 3184 
5 1992-03-21 01:13:18 B 45.304784 34.62654 NaN 3184 
+0

Vielen Dank! Es funktioniert perfekt und schnell mit dem vollständigen Datensatz, der über 2 Millionen Zeilen hat. – PigFoot

0

Sie einen Blick auf die folgenden nehmen :

In [24]: df 
Out[24]: 
    area id 
0 A 3183 
1 A 3183 
2 A 3184 
3 B 3184 
4 A 3185 
5 A 3185 

In [25]: df[df.groupby('id')['area'].transform('nunique') > 1] 
Out[25]: 
    area id 
2 A 3184 
3 B 3184 

Ich habe mein Beispiel auf die 2 relevanten Spalten (ID und Bereich) reduziert, aber das würde problemlos mit Ihrem vollständigen DataFrame funktionieren.

Ich zähle grundsätzlich die Anzahl der verschiedenen Bereiche für jede ID und filtere diejenigen mit nur einem Bereich aus.

+0

Ich versuchte Ihren Ansatz, aber es hat nicht für mich funktioniert. Vielleicht habe ich etwas falsch gemacht. Danke für die Hilfe trotzdem! – PigFoot

Verwandte Themen