2016-10-05 35 views
0

我想在pandas.DataFrame放棄某些特定行,而似乎pandas.Series.drop()。什麼我已經試過如下:一些誤解約`pandas.series.drop()`

In[1]: 
a_pd = pd.DataFrame(np.array([[1,2,3], [2,'?','x'],['s','d',4]]), columns=list('abc')) 
a_pd 
Out[1]: 
    a b c 
    0 1 2 3 
    1 2 ? x 
    2 s d 4 

In[2]: 
a_pd['b'].drop(a_pd['b'] == '?', inplace=True) 
a_pd 
out[2]: 
    a b c 
0 1 2 3 
1 2 ? x 
2 s d 4 

爲什麼它是相同a_pd ??? 後來我試過pandas.DataFrame.drop,結果是更驚人:

In[3]: 
b_pd = a_pd.drop(a_pd['b'] == '?') 
out[3]: 
a b c 
1 2 ? x 
2 s d 4 

發生了什麼?我簡直不敢相信我的眼睛。雖然我可以通過簡單地使用a_pd[a_pd['b'] != '?']輕鬆選擇我想要的,但我仍然想嘗試drop()

+0

順便說一句,你可以共享,從jupyter筆記本複製內容的招數?看來我不能直接複製在Chrome中打開的jupyter的輸出。 –

+0

拖放在索引上工作,所以你必須通過索引向量。 'a_pd.drop(a_pd [a_pd ['b'] =='?']。index)' - 請不要這樣做是真正的代碼。這是醜陋的,難以閱讀。改用切片符號'a_pd = a_pd.loc [a_pd.b!='?',:]'。 – cel

+0

我嘗試過'a_pd.drop(a_pd [a_pd ['b'] =='?']。index)',但發生了錯誤'IndexingError:Unalignable boolean Series key provided provided' –

回答

2

pandas.drop()的作品與你想要做刪除,在這種情況下是0,1,或2。所以,你可以通過

a_pd.drop([1]) 

回報刪除中間行的行相關的標籤

a b c 
0 1 2 3 
2 s d 4 

同樣,對於.drop()系列版本,將從系列中刪除一行。

a_pd['b'].drop([1]) 

回報

0 2 
2 d 

當您使用選擇

a_pd['b'] == '?' 

你布爾值

0 False 
1 True 
2 False 
Name: b, dtype: bool 

的數組和

結果
a_pd.drop(a_pd['b'] == '?') 

相同

a_pd.drop([False, True, False]) 

但現在在哪並不如預期的事情,那裏的布爾值是真,而不是申請的下降,這個數組被視爲整數索引的數組下降即

a_pd.drop([0, 1, 0]) 

,因此結果是除去前兩行(第一行被除去兩次)

a b c 
2 s d 4 

至少,這是它是如何工作的我的版本大熊貓

pandas.__version__ 
$> u'0.17.1'