从Numpy数组中的包含空值的DataFrame中删除行

时间:2018-02-28 17:07:26

标签: python pandas numpy

我正在尝试从numpy数组

中包含空值的DataFrame中删除行

数据帧:

name    array   
A       [nan, nan, nan] 
B       [111.425818592, -743.060293425, -180.420675659] 

预期输出

name    array   
B       [111.425818592, -743.060293425, -180.420675659] 

我的尝试:

df = df[df['array'].apply(lambda x: np.where(~np.isnan(x)))]

我得到的错误是:

  

TypeError:不可用类型:' numpy.ndarray'

3 个答案:

答案 0 :(得分:2)

来自jpp的数据

search

答案 1 :(得分:0)

这是一种方式:

import pandas as pd, numpy as np

df = pd.DataFrame([['A', np.array([np.nan, np.nan, np.nan])],
                   ['B', np.array([111.425818592, -743.060293425, -180.420675659])]],
                  columns=['name', 'array'])

df = df[~np.all(list(map(np.isnan, df['array'])), axis=1)]

#   name                                            array
# 1    B  [111.425818592, -743.060293425, -180.420675659]

或者,如果要删除数组中任何值为NaN的行:

df = df[~np.any(list(map(np.isnan, df['array'])), axis=1)]

答案 2 :(得分:0)

你真的应该考虑在数据帧列中放弃使用numpy数组,你在系列中执行的每一个操作都会让人心痛。而只是转换为数据帧,然后使用pandas功能

dfnew = pd.DataFrame(np.concatenate([df.name.values.reshape(-1,1),   
                     np.array(df.array.tolist())],axis=1),
                     columns['name','array1','array2','array3'])

  name   array1  array2   array3
0    A      NaN     NaN      NaN
1    B  111.426 -743.06 -180.421

现在您可以使用dropna()

dfnew.dropna(axis=0)

  name   array1  array2   array3
1    B  111.426 -743.06 -180.421

如果需要,您可以随时提取单个数组

dfnew.iloc[1,1:].values

array([111.425818592, -743.060293425, -180.420675659], dtype=object)