2016-06-19 76 views
1

我DF:大熊貓子集,並基於列的值降排

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 

到子集基於列的值:

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 

砸基於列的值:

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 

有沒有辦法一次完成這兩個?類似於基於列值的行的子集並在原始df中刪除相同的行。

+0

我做這個循環操作(超過數萬次迭代),如果我能在一杆兩者都做我可能節省一些時間。只是好奇 :) – ramesh

回答

3

這不是真正一個炮打響,但通常做的方式,這是重用一個布爾面具,像這樣:

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

您還可以使用drop()

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

輸出:

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

如果你想修復index,你可以這樣做。

dframe.index = range(len(dframe)) 

輸出:

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

想一想的另一種方法。

gb = dframe.groupby(dframe.A == 'a') 
isa, nota = gb.get_group(True), gb.get_group(False)