我正在使用python 2.7.3和Pandas版本0.12.0。
我想删除带有NaN索引的行,以便我只有有效的site_id值。
print df.head()
special_name
site_id
NaN Banana
OMG Apple
df.drop(df.index[0])
TypeError: 'NoneType' object is not iterable
如果我尝试删除范围,请执行以下操作:
df.drop(df.index[0:1])
我收到此错误:
AttributeError: 'DataFrame' object has no attribute 'special_name'
答案 0 :(得分:25)
使用pandas版本> = 0.20.0,您可以:
df[df.index.notnull()]
旧版本:
df[pandas.notnull(df.index)]
要打破它:
notnull
生成一个布尔掩码,例如[False, False, True]
,其中True表示相应位置的值为null(numpy.nan
或None
)。然后,我们使用df[boolean_mask]
选择索引对应于掩码中的真值的行。
答案 1 :(得分:15)
我发现最简单的方法是重置索引,删除NaN,然后再次重置索引。
In [26]: dfA.reset_index()
Out[26]:
index special_name
0 NaN Apple
1 OMG Banana
In [30]: df = dfA.reset_index().dropna().set_index('index')
In [31]: df
Out[31]:
special_name
index
OMG Banana
答案 2 :(得分:2)
测试过这个工作:
df.reset_index(inplace=True)
df.drop(df[df['index'].isnull()].index, inplace=True)
使用原始问题复制表格
df=pd.DataFrame(data=['Banana', 'Apple'], index=[np.nan, 'OMG'],columns=['Special_name'])
然后输入以上两个代码行 - 我尝试用下面的人类语言解释:
df[df['index'].isnull()]
过滤名为' index'的列。显示' NaN'使用isnull()命令的值。 .index
用于将指向所有' = NaN行的明确索引对象传递到表达式最外部的df.drop(
。 nb:测试上面的命令以处理列中的多个NaN值
使用Python 3.5.1,Pandas 0.17.1通过Anaconda包32位
答案 3 :(得分:1)
编辑:以下内容可能仅适用于MultiIndex
,并且在任何情况下都会被新的df.index.isnull()
函数废弃(请参阅其他答案)。我会留下这个答案仅仅是为了历史。
对于那些现在来到这里的人来说,可以直接这样做而无需重新索引,依赖于索引中的NaN将用标签-1
表示的事实。所以:
df = dfA[dfA.index.labels!=-1]
更好的是,在Pandas> 0.16.1中,可以使用drop()在不进行复制的情况下执行此操作:
dfA.drop(labels=[-1], level='index', inplace=True)
注意:索引级别被称为“索引”有点误导:它通常是更具特定用途的东西,如'date'或'experimental_run'..
答案 4 :(得分:1)
这些答案对我来说都不是100%。这是有效的:
In [26]: print df
Out[26]:
site_id special_name
0 OMG Apple
1 NaN Banana
2 RLY Orange
In [27]: df.dropna(inplace=True)
Out[27]:
site_id special_name
0 OMG Apple
2 RLY Orange
In [28]: df.reset_index(inplace=True)
Out[28]:
index site_id special_name
0 0 OMG Apple
1 2 RLY Orange
In [29]: df.drop('index', axis='columns', inplace=True)
Out[29]:
site_id special_name
0 OMG Apple
1 RLY Orange
答案 5 :(得分:1)
自pandas
0.19开始,Index
确实有.notnull()
方法,因此 timdiels 的答案可以简化为:
df[df.index.notnull()]
我认为(目前)是最简单的。