Python pandas:从字符串列的数据选择中过滤NaN
Python pandas:从字符串列的数据选择中过滤NaN
不使用groupby
,如何过滤掉没有NaN
的数据?
假设我有一个矩阵,其中一些客户会填写\'N/A\',\'n/a\'
或其任何变体,其他人则留空:
import pandas as pd import numpy as np df = pd.DataFrame({'movie': ['thg', 'thg', 'mol', 'mol', 'lob', 'lob'], 'rating': [3., 4., 5., np.nan, np.nan, np.nan], 'name': ['John', np.nan, 'N/A', 'Graham', np.nan, np.nan]}) nbs = df['name'].str.extract('^(N/A|NA|na|n/a)') nms=df[(df['name'] != nbs) ]
输出:
>>> nms movie name rating 0 thg John 3 1 thg NaN 4 3 mol Graham NaN 4 lob NaN NaN 5 lob NaN NaN
我应该如何过滤掉NaN
值,以便获得可以处理的结果,如下所示:
movie name rating 0 thg John 3 3 mol Graham NaN
我猜我需要像~np.isnan
这样的内容,但是~
不能用于字符串。
admin 更改状态以发布 2023年5月22日
只需放弃它们:
nms.dropna(thresh=2)
这将删除所有至少有两个非 NaN
的行。
然后您可以删除名称为 NaN
的行:
In [87]: nms Out[87]: movie name rating 0 thg John 3 1 thg NaN 4 3 mol Graham NaN 4 lob NaN NaN 5 lob NaN NaN [5 rows x 3 columns] In [89]: nms = nms.dropna(thresh=2) In [90]: nms[nms.name.notnull()] Out[90]: movie name rating 0 thg John 3 3 mol Graham NaN [2 rows x 3 columns]
编辑
实际上,根据您最初的需求,可以在无需调用 dropna
的情况下执行以下操作:
nms[nms.name.notnull()]
更新
在三年后查看这个问题时,发现有个错误,首先 thresh
参数寻找至少 n
个非 NaN
值,因此实际输出应该是:
In [4]: nms.dropna(thresh=2) Out[4]: movie name rating 0 thg John 3.0 1 thg NaN 4.0 3 mol Graham NaN
可能我三年前要么错了,要么我运行的 Pandas 版本有漏洞,两种情况都完全有可能。