2016-06-19 10 views
1

meine df:Pandas Teilmenge und Drop Zeilen basierend auf Spaltenwert

dframe = pd.DataFrame({"A":list("aaaabbbbccc"), "C":range(1,12)}, index=range(1,12)) 

Out[9]: 
    A C 
1 a 1 
2 a 2 
3 a 3 
4 a 4 
5 b 5 
6 b 6 
7 b 7 
8 b 8 
9 c 9 
10 c 10 
11 c 11 

basierend auf Spaltenwert Teilmenge:

In[11]: first = dframe.loc[dframe["A"] == 'a'] 
In[12]: first 
Out[12]: 
    A C 
1 a 1 
2 a 2 
3 a 3 
4 a 4 

auf Spaltenwert basierend auf DROP:

In[16]: dframe = dframe[dframe["A"] != 'a'] 
In[17]: dframe 
Out[16]: 
    A C 
5 b 5 
6 b 6 
7 b 7 
8 b 8 
9 c 9 
10 c 10 
11 c 11 

Gibt es eine Möglichkeit, beides auf einmal zu tun? Wie die Unterteilung von Zeilen basierend auf einem Spaltenwert und das Löschen der gleichen Zeilen im ursprünglichen df.

+0

Ich mache diese Operation in Schleife (über Zehntausender Iterationen), wenn ich beides auf einmal tun kann, kann ich etwas Zeit sparen. Nur neugierig :) – ramesh

Antwort

3

Es ist nicht wirklich in einem Schuss, aber in der Regel die Art und Weise, dies zu tun ist, eine boolean Maske wiederverwenden, wie folgt aus:

In [28]: mask = dframe['A'] == 'a' 

In [29]: first, dframe = dframe[mask], dframe[~mask] 

In [30]: first 
Out[30]: 
    A C 
1 a 1 
2 a 2 
3 a 3 
4 a 4 

In [31]: dframe 
Out[31]: 
    A C 
5 b 5 
6 b 6 
7 b 7 
8 b 8 
9 c 9 
10 c 10 
11 c 11 
2

Sie auch drop()

dframe = dframe.drop(dframe.index[dframe.A == 'a']) 

Ausgabe verwenden:

A C 
5 b 5 
6 b 6 
7 b 7 
8 b 8 
9 c 9 
10 c 10 
11 c 11 

Wenn Sie die index beheben möchten, können Sie dies tun.

dframe.index = range(len(dframe)) 

Ausgang:

A C 
0 b 5 
1 b 6 
2 b 7 
3 b 8 
4 c 9 
5 c 10 
6 c 11 
0

Eine alternative Möglichkeit, darüber nachzudenken.

Verwandte Themen