关于`pandas.series.drop()`的一些误解

时间:2016-10-05 03:37:41

标签: python pandas

我想删除pandas.DataFrame中的某些特定行,而似乎是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()

1 个答案:

答案 0 :(得分: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])

但现在事情并不像预期的那样,而不是在布尔值为True时应用一个drop,这个数组被视为一个整数索引的数组,即

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

因此结果是删除前两行(第一行被删除两次)

   a  b  c
2  s  d  4

至少这是我的熊猫版本的工作方式

pandas.__version__
$> u'0.17.1'