数据框仍具有NaN

时间:2018-10-03 15:13:00

标签: python pandas dataframe

为什么会这样编码:

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 ,:]的方式了)

1 个答案:

答案 0 :(得分:1)

首先,我认为缩进是错误的,但是当然,这并不是什么大问题。

然后,您必须知道一些事实,即NaN处的pandas/numpy不是一些简单的空对象。

如果您使用以下代码,例如bool(np.nan),它将输出True,它正是您用来删除X=[(k,c) for k in dataframe.loc[:,c] if k]处的空白的字符。

如果您确实要删除空白或确定nan,请使用numpy.isnanpd.isna。 或者,您仅使用pandas.dropna

第二个问题,我想您可能会误解nonzero的含义,在pd.isnull(NDF).any(1)之后,您得到了一个纯pd.Series,没有索引。因此,您只需要获取一些由自然数构成的索引。

更简单地说,您应该使用NDF.iloc[ans,:],因为nonzero返回Series的索引,而不是dataframe的索引。