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

问题描述 投票:2回答:3

我试图从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'

python pandas numpy
3个回答
2
投票

来自jpp的数据

df[~pd.DataFrame(df.array.tolist()).isnull().all(1)]
Out[391]: 
  name                                            array
1    B  [111.425818592, -743.060293425, -180.420675659]

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)]

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)
© www.soinside.com 2019 - 2024. All rights reserved.