Lev*_*tor 198 python null nan pandas
我有一个〜300K行和~40列的数据帧.我想知道是否有任何行包含空值 - 并将这些'null'行放入一个单独的数据帧中,以便我可以轻松地探索它们.
我可以明确地创建一个掩码:
mask = False
for col in df.columns:
mask = mask | df[col].isnull()
dfnulls = df[mask]
Run Code Online (Sandbox Code Playgroud)
或者我可以这样做:
df.ix[df.index[(df.T == np.nan).sum() > 1]]
Run Code Online (Sandbox Code Playgroud)
是否有一种更优雅的方式(找到包含空值的行)?
DSM*_*DSM 336
[更新以适应现代pandas
,其isnull
作为一种方法DataFrame
...]
您可以使用isnull
和any
构建一个布尔系列,并使用它来索引您的框架:
>>> df = pd.DataFrame([range(3), [0, np.NaN, 0], [0, 0, np.NaN], range(3), range(3)])
>>> df.isnull()
0 1 2
0 False False False
1 False True False
2 False False True
3 False False False
4 False False False
>>> df.isnull().any(axis=1)
0 False
1 True
2 True
3 False
4 False
dtype: bool
>>> df[df.isnull().any(axis=1)]
0 1 2
1 0 NaN 0
2 0 0 NaN
Run Code Online (Sandbox Code Playgroud)
[对于年长者pandas
:]
您可以使用该函数isnull
而不是方法:
In [56]: df = pd.DataFrame([range(3), [0, np.NaN, 0], [0, 0, np.NaN], range(3), range(3)])
In [57]: df
Out[57]:
0 1 2
0 0 1 2
1 0 NaN 0
2 0 0 NaN
3 0 1 2
4 0 1 2
In [58]: pd.isnull(df)
Out[58]:
0 1 2
0 False False False
1 False True False
2 False False True
3 False False False
4 False False False
In [59]: pd.isnull(df).any(axis=1)
Out[59]:
0 False
1 True
2 True
3 False
4 False
Run Code Online (Sandbox Code Playgroud)
导致相当紧凑:
In [60]: df[pd.isnull(df).any(axis=1)]
Out[60]:
0 1 2
1 0 NaN 0
2 0 0 NaN
Run Code Online (Sandbox Code Playgroud)
Rok*_*jic 57
nans = lambda df: df[df.isnull().any(axis=1)]
Run Code Online (Sandbox Code Playgroud)
那么当你需要它时你可以输入:
nans(your_dataframe)
Run Code Online (Sandbox Code Playgroud)
少了四个字符,但多了 2 毫秒
\n%%timeit\ndf.isna().T.any()\n# 52.4 ms \xc2\xb1 352 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 10 loops each)\n\n%%timeit\ndf.isna().any(axis=1)\n# 50 ms \xc2\xb1 423 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 10 loops each)\n
Run Code Online (Sandbox Code Playgroud)\n我可能会用axis=1
如果要按具有空值的特定数量的列过滤行,可以使用以下命令:
df.iloc[df[(df.isnull().sum(axis=1) >= qty_of_nuls)].index]
Run Code Online (Sandbox Code Playgroud)
所以,这是一个例子:
您的数据框:
>>> df = pd.DataFrame([range(4), [0, np.NaN, 0, np.NaN], [0, 0, np.NaN, 0], range(4), [np.NaN, 0, np.NaN, np.NaN]])
>>> df
0 1 2 3
0 0.0 1.0 2.0 3.0
1 0.0 NaN 0.0 NaN
2 0.0 0.0 NaN 0.0
3 0.0 1.0 2.0 3.0
4 NaN 0.0 NaN NaN
Run Code Online (Sandbox Code Playgroud)
如果要选择具有两个或多个空值列的行,请运行以下命令:
>>> qty_of_nuls = 2
>>> df.iloc[df[(df.isnull().sum(axis=1) >=qty_of_nuls)].index]
0 1 2 3
1 0.0 NaN 0.0 NaN
4 NaN 0.0 NaN NaN
Run Code Online (Sandbox Code Playgroud)