为什么会这样编码:
def remove_empties(dataframe):
classes = list(dataframe)
new_dataframe = pd.DataFrame(columns=["Value", "Label"])
for c in classes:
X=[(k,c) for k in dataframe.loc[:,c] if k]
T = pd.DataFrame(X, columns =["Value", "Label"] )
new_dataframe = new_dataframe.append(T)
return new_dataframe
还能产生NaN元素吗? 如(打印结果后):
298110 SP WorkState
298111 RJ WorkState
298112 SP WorkState
298113 SP WorkState
298114 Scotland WorkState
298115 NaN WorkState
实际上是在申请后:
ans = pd.isnull(NDF).any(1).nonzero()[0]
NDF.loc[ans]
我得到多个结果:
Value Label
1430923 NaN FirstName
1430923 - LastName
1532357 jty LastName
3822535 NaN NaN
3830294 NaN NaN
4300250 NaN NaN
5201009 NaN NaN
5396591 NaN NaN
5485877 NaN NaN
5561799 NaN NaN
5619806 NaN NaN
5680834 NaN NaN
6620272 NaN NaN
7539369 NaN NaN
8390860 NaN NaN
8688976 NaN NaN
其中一个不为空(jty,LastName),而我仅通过打印注意到的一个不存在于索引的ans列表中
编辑:(已解决,但认为我仍然应该发布对我有帮助的东西,主要感谢所有答复):
k= numpy.nan
if k :
print("Hi")
else:
print("NO")
打印嗨
k= None
if k :
print("Hi")
else:
print("NO")
不打印
(更不用说我使用.loc [ans]而不是.loc [ans ,:]的方式了)
答案 0 :(得分:1)
首先,我认为缩进是错误的,但是当然,这并不是什么大问题。
然后,您必须知道一些事实,即NaN
处的pandas/numpy
不是一些简单的空对象。
如果您使用以下代码,例如bool(np.nan)
,它将输出True
,它正是您用来删除X=[(k,c) for k in dataframe.loc[:,c] if k]
处的空白的字符。
如果您确实要删除空白或确定nan
,请使用numpy.isnan
或pd.isna
。
或者,您仅使用pandas.dropna
。
第二个问题,我想您可能会误解nonzero
的含义,在pd.isnull(NDF).any(1)
之后,您得到了一个纯pd.Series
,没有索引。因此,您只需要获取一些由自然数构成的索引。
更简单地说,您应该使用NDF.iloc[ans,:]
,因为nonzero
返回Series
的索引,而不是dataframe
的索引。