使用.loc或.iloc而不是.ix

时间:2018-03-07 16:31:47

标签: python pandas

我正在使用python 3.6。

我有一个pandas.core.frame.DataFrame,并希望根据名为“Closed Date”的列是否为空来过滤整个DataFrame。换句话说,如果在“关闭日期”列中为空,则从DataFrame中删除整行。

我现在的代码如下:

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

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

1 个答案:

答案 0 :(得分:3)

这应该适合你:

data1 = raw_data.loc[raw_data['Closed Date'].notnull()]

.ix与当前.loc非常相似(这就是为什么正确的.loc语法与您最初使用.ix进行的操作相同的原因)。根据{{​​3}}的不同之处在于:" ix通常会尝试像loc一样行事,但如果索引中不存在标签,那么它就会像iloc一样行为"

示例

以此数据框为例(让我们称之为raw_data):

   Closed Date    x
0          1.0  1.0
1          2.0  2.0
2          3.0  NaN
3          NaN  3.0
4          4.0  4.0

raw_data.notnull()返回此DataFrame:

   Closed Date      x
0         True   True
1         True   True
2         True  False
3        False   True
4         True   True

您无法根据布尔值的数据框使用.loc进行索引。但是,当您执行raw_data['Closed Date'].notnull()时,最终会得到系列

0     True
1     True
2     True
3    False
4     True

哪个可以作为一种"布尔过滤器传递给.loc"申请数据框。

替代解决方案

正如John Clemens所指出的那样,raw_data.dropna(subset=['Closed Date'])可以实现同样的目标。 .dropna方法的this detailed answer概述了在某些情况下如何更灵活(例如,允许使用{{删除任何或所有值均为NaN的行或列1}}论证等...)