2016-08-08 13 views
1

Ich habe große DataFrame mit GPS-Pfad und einige Attribute. Ein paar Abschnitte des Pfades sind diejenigen, die ich analysieren muss. Ich möchte nur diese Abschnitte auf einen neuen DataFrame unterteilen. Ich kann einen Abschnitt zu der Zeit unterteilen, aber die Idee ist, sie alle zu haben und einen ursprünglichen Index zu haben.Wählen Sie mehrere Abschnitte von Reihen nach Index in Pandas

Das Problem ist ähnlich:

import pandas as pd 
df = pd.DataFrame({'A':[0,1,2,3,4,5,6,7,8,9],'B':['a','b','c','d','e','f','g','h','i','j']}, 
        index=range(10,20,)) 

Ich mag o bekommen so etwas wie:

cdf = df.loc[[11:13] & [17:20]] # SyntaxError: invalid syntax 

gewünschtes Ergebnis:

A B 
11 1 b 
12 2 c 
13 3 d 
17 7 h 
18 8 i 
19 9 j 

Ich weiß, dass das Beispiel einfach mit cdf = df.loc[[11,12,13,17,18,19],:] aber Im ursprünglichen Problem habe ich tausende Zeilen und einige Einträge bereits entfernt, also Listenpunkte sind eher keine Option.

Antwort

3

Eine mögliche Lösung mit concat:

cdf = pd.concat([df.loc[11:13], df.loc[17:20]]) 
print (cdf) 
    A B 
11 1 b 
12 2 c 
13 3 d 
17 7 h 
18 8 i 
19 9 j 

Eine andere Lösung mit range:

cdf = df.ix[list(range(11,14)) + list(range(17,20))] 
print (cdf) 
    A B 
11 1 b 
12 2 c 
13 3 d 
17 7 h 
18 8 i 
19 9 j 
4

Sie np.r_ verwenden könnten die Scheiben verketten:

In [16]: df.loc[np.r_[11:13, 17:20]] 
Out[16]: 
    A B 
11 1 b 
12 2 c 
17 7 h 
18 8 i 
19 9 j 

Beachten Sie jedoch, dass df.loc[A:B] wählt die Etiketten A bis B mit B aus. np.r_[A:B] liefert ein Array von A bis B mit B ausgeschlossen. Um B einzuschließen, müssten Sie np.r_[A:B+1] verwenden.

Beim Übergeben einer Scheibe, wie df.loc[A:B], df.loc ignoriert Etiketten, die nicht in df.index sind. Im Gegensatz dazu kann ein Array wie df.loc[np.r_[A:B]], df.loc eine neue Zeile mit NaNs für jeden Wert im Array hinzufügen, die nicht in df.index ist.

Damit das gewünschte Ergebnis zu erzielen, müssen Sie den rechten Endpunkt der Scheiben einzustellen und isin für die Mitgliedschaft in df.index zu testen:

In [26]: df.loc[df.index.isin(np.r_[11:14, 17:21])] 
Out[26]: 
    A B 
11 1 b 
12 2 c 
13 3 d 
17 7 h 
18 8 i 
19 9 j 
+0

Dank, interessante Lösung – tomasz74

Verwandte Themen