Python 如何删除包含NaN数组的行?

Python 如何删除包含NaN数组的行?,python,pandas,nan,Python,Pandas,Nan,我有这样一个df: num1 num2 0 [2.0] 10 1 [3.0] 20 2 [4.0] 30 3 [5.0] 40 4 [6.0] 50 5 [nan] 60 6 [nan] 70 7 [10.0] 80 8 [nan] 90 9 [15.0] 100 num1列包含浮点数组[nan]是一个numpy数组,包含一个np.nan 我通过以下方式将其转换为整数: 如果我只使用这个df: num1 num2

我有这样一个df:

   num1    num2
0  [2.0]   10
1  [3.0]   20
2  [4.0]   30
3  [5.0]   40
4  [6.0]   50
5  [nan]   60 
6  [nan]   70
7  [10.0]  80
8  [nan]   90
9  [15.0]  100
num1
列包含浮点数组
[nan]
是一个numpy数组,包含一个
np.nan

我通过以下方式将其转换为整数:

如果我只使用这个df:

   num1    num2
0  [2.0]   10
1  [3.0]   20
2  [4.0]   30
3  [5.0]   40
4  [6.0]   50
当没有
[nan]
并且我得到:

   num1   num2
0  2.0  10
1  3.0  20
2  4.0  30
3  5.0  40
4  6.0  50
但是如果我在
[nan]
中包含完整的df,我会得到错误:

`ValueError: cannot convert float NaN to integer`
TypeError: len() of unsigned object  
我试着做:

df[df['num1'] != np.array(np.NaN)]
但这就产生了错误:

`ValueError: cannot convert float NaN to integer`
TypeError: len() of unsigned object  
如何获得所需的输出:

   num1    num2
0  2.0   10
1  3.0   20
2  4.0   30
3  5.0   40
4  6.0   50
5  10.0  80
6  15.0  100
试试这个-

df['num1'] = df['num1'].apply(lambda x: x[0]).dropna() # unlist the list of numbers (assuming you dont have multiple)
df['num1'] = list(map(int, df['num1'])) # map operation
print(df)
输出

   num1  num2
0     2    10
1     3    20
2     4    30
3     5    40
4     6    50
7    10    80
9    15   100
计时(取决于数据大小)


这应该去掉所有那些
nan
列表,只需添加以下内容:

df = df.loc[df['num1'].str[0].dropna().index]
然后您可以按原样运行其余代码

df['num1'] = df.num1.str[0]
df.dropna(axis=0, inplace=True)
受答案启发但不使用loc的解决方案 以下是输出:

num1    num2
0   2.0 10
1   3.0 20
2   4.0 30
3   5.0 40
4   6.0 50
7   10.0    80
9   15.0    100

您可以按以下方式进行操作:

# convert np array containing NaNs into np.NaN
df['num1']=df['num1'].apply(lambda x: np.nan if np.nan in x else x[0])

# use dropna to drop the rows
df=df['num1'].dropna()
print(df)
输出:

   num1    num2
0  2.0   10
1  3.0   20
2  4.0   30
3  5.0   40
4  6.0   50
5  10.0  80
6  15.0  100

正如你所看到的,有很多选择。您可以转换为数字,然后删除空值:

import pandas as pd
import numpy as np

data = dict(num1=[[2.0],[np.nan],['apple']])

df = pd.DataFrame(data)

m = pd.to_numeric(df['num1'].apply(lambda x: x[0]),errors='coerce').dropna().index

df = df.loc[m]

您是否尝试过:
df=df[np.isfinite(df['EPS'])]
@fabianegli在副本中的何处说明了如何删除df中等于数组的值…?第1列中元素的数据类型是什么??int或obejct???@EspoirMurhabazi浮动列表感谢您的回答。我刚刚更新了我的输出(我没有删除
映射之后的列表)。所以你的答案仍然有效,只是不需要最后一行就可以转换回列表。@fabianegli为我工作过'\_(ツ)_/“”(对于我来说,
drop na
位于单独的一行,如
df=df.dropna(subset='num1'))
@Chuck我的问题是,您必须更改代码以使其正常工作。现在的方式会引发ValueError。如果将此解决方案编辑为包含实际有效的代码,我将删除我的否决票。第一个代码似乎不会生成OP WANTS输出。此代码还将删除任何其他列中包含np.NaN的行谢谢你的反馈和评论,我没想过,但它解决了这个问题