我正在使用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
我该如何解决这个问题?有什么建议吗?
答案 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}}论证等...)