Output = df[df['TELF1'].isnull() | df['STCEG'].isnull() | df['STCE1'].isnull()]
这是我的代码,如果列包含 nan
值而不是只选择该行,我将在此处检查。但在这里我有 10 多个专栏可以做到这一点。这将使我的代码变得庞大。有没有更短或更 pythonic 的方法来做到这一点。
df.dropna(subset=['STRAS','ORT01','LAND1','PSTLZ','STCD1','STCD2','STCEG','TELF1','BANKS','BANKL','BANKN','E-MailAddress'])
有什么方法可以得到与上述命令相反的结果。它会给我与我在上面尝试的相同的输出,但它变得很长。
最佳答案
将 loc
与简单的 bool 过滤器一起使用应该可以:
df = pd.DataFrame(np.random.random((5,4)), columns=list('ABCD'))
subset = ['C', 'D']
df.at[0, 'C'] = None
df.at[4, 'D'] = None
>>> df
A B C D
0 0.985707 0.806581 NaN 0.373860
1 0.232316 0.321614 0.606824 0.439349
2 0.956236 0.169002 0.989045 0.118812
3 0.329509 0.644687 0.034827 0.637731
4 0.980271 0.001098 0.918052 NaN
>>> df.loc[df[subset].isnull().any(axis=1), :]
A B C D
0 0.985707 0.806581 NaN 0.37386
4 0.980271 0.001098 0.918052 NaN
df[subset].isnull()
返回是否有任何子集列具有 NaN
的 bool 值。
>>> df[subset].isnull()
C D
0 True False
1 False False
2 False False
3 False False
4 False True
.any(axis=1)
将返回 True
如果行中的任何值(因为 axis=1,否则列)为 True。
>>> df[subset].isnull().any(axis=1)
0 True
1 False
2 False
3 False
4 True
dtype: bool
最后,使用loc
(行,列)定位满足 bool 条件的行。 :
符号表示选择所有内容,因此它选择第 0 行和第 4 行的所有列。
关于python-2.7 - 我应该如何检查超过 10 列的 nan 值并选择那些具有 nan 值的行,即 keepna() 而不是 dropna(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33118600/