我想删除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()
。
答案 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'