Python 使用.loc或.iloc代替.ix

Python 使用.loc或.iloc代替.ix,python,pandas,Python,Pandas,我正在使用python 3.6 我有一个pandas.core.frame.DataFrame,希望根据名为“Closed Date”的列是否不为空来过滤整个数据帧。换句话说,如果“Closed Date”列中的值为null,则从数据框中删除整行 我现在的代码如下: data = raw_data.ix[raw_data['Closed Date'].notnull()] 虽然它完成了任务,但我收到了一条温暖的信息,上面说: C:\ProgramData\Anaconda3\lib\site-

我正在使用python 3.6

我有一个
pandas.core.frame.DataFrame
,希望根据名为“Closed Date”的列是否不为空来过滤整个数据帧。换句话说,如果“Closed Date”列中的值为null,则从数据框中删除整行

我现在的代码如下:

data = raw_data.ix[raw_data['Closed Date'].notnull()]
虽然它完成了任务,但我收到了一条温暖的信息,上面说:

C:\ProgramData\Anaconda3\lib\site-packages\ipykernel_launcher.py:1: DeprecationWarning: 
.ix is deprecated. Please use
.loc for label based indexing or
.iloc for positional indexing
我尝试了以下代码:

data1 = raw_data.loc[raw_data.notnull(), 'Closed Date']
但是得到这个错误:

ValueError: Cannot index with multidimensional key

我该如何解决这个问题?有什么建议吗?

这应该对你有用:

data1 = raw_data.loc[raw_data['Closed Date'].notnull()]
.ix
与当前的
.loc
非常相似(这就是为什么正确的
.loc
语法与您最初使用的
.ix
语法相同的原因)。不同之处在于:“ix通常试图表现得像loc,但如果索引中不存在标签,则会倒退到像iloc。”

示例

以这个数据帧为例(我们称之为
raw\u data
):

raw\u data.notnull()
返回此数据帧:

   Closed Date      x
0         True   True
1         True   True
2         True  False
3        False   True
4         True   True
不能使用基于布尔值的数据帧的
.loc
进行索引。但是,如果执行
原始数据['Closed Date'].notnull()
,则会得到一系列结果:

它可以作为一种“布尔过滤器”传递到
.loc
,以应用于数据帧

替代解决方案


正如约翰·克莱门斯所指出的,同样可以通过
raw_data.dropna(subset=['Closed Date'])
实现。
.dropna
方法的示例概述了在某些情况下如何更加灵活(例如,允许使用
how
参数删除任何或所有值均为
NaN
的行或列等)

您可以认为
原始数据。dropna(子集=['Closed Date')
更加明确。。。(可以扩展到多列,并有
how
选项)。@JonClements我认为这是一个很好的观点,解决了问题的XY性。然而,我喜欢这解释了发生了什么wrong@JonClements诚然,这将导致同样的结果,并且在某些情况下可能会证明更加灵活;OP特别询问了
.loc
.iloc
确实-这确实解决了。。。不是说它不。。。意识到这是一个可供选择的选项,它可以在多个栏目上工作,并且如果OP需要,可以在适当的位置操作。@sacul顺便说一句,不要羞于在你的帖子中包含jc的建议。它将使未来的读者更容易阅读(当然是有信用的)。
   Closed Date      x
0         True   True
1         True   True
2         True  False
3        False   True
4         True   True
0     True
1     True
2     True
3    False
4     True