删除包含> N NaNs的列,不包括特定列

时间:2017-09-20 16:39:58

标签: python pandas filtering nan

我想知道是否有一种方法可以排除超过 N NaN的所有列,不包括该子集中的一列。

例如:

df = pd.DataFrame([[np.nan, 2, np.nan, 0], 
                   [3, 4, np.nan, 1],
                   [np.nan, np.nan, np.nan, 5]],
                  columns=list('ABCD'))

结果:

    A   B   C   D
0   NaN 2.0 NaN 0
1   3.0 4.0 NaN 1
2   NaN NaN NaN 5

运行以下内容,我得到:

df.dropna(thresh=2, axis=1)

    B   D
0   2.0 0
1   4.0 1
2   NaN 5

我想保留列'C'。即,除了列'C'之外,执行此阈值处理。

这可能吗?

3 个答案:

答案 0 :(得分:3)

一旦完成阈值处理,您就可以将列放回去。如果您在一行中执行此操作,则甚至不需要存储对该列的引用。

import pandas as pd
import numpy as np

df = pd.DataFrame([[np.nan, 2, np.nan, 0],
                   [3, 4, np.nan, 1],
                   [np.nan, np.nan, np.nan, 5]],
                  columns=list('ABCD'))
df.dropna(thresh=2, axis=1).assign(C=df['C'])

您也可以

C = df['C']
df.dropna(thresh=2, axis=1)
df.assign(C=C)

正如@Wen所建议的那样,你也可以做一个不会删除C列的索引操作。

threshold = 2
df = df.loc[:, (df.isnull().sum(0) < threshold) | (df.columns == 'C')]

此列的索引将选择值少于threshold NaN或名称为C的列。如果您想在异常中包含多个列,则可以使用“或”运算符|链接更多条件。例如:

df = df.loc[
    :,
    (df.isnull().sum(0) < threshold) |
    (df.columns == 'C') |
    (df.columns == 'D')]

答案 1 :(得分:2)

Step 5/5 : COPY MyAgSourceAPI/conf/php/apache2/php.ini /usr/local/etc/php/
COPY failed: stat /var/lib/docker/tmp/docker-builder231753667/MyAgSourceAPI/conf/php/apache2/php.ini: no such file or directory

根据Zero的建议

df.loc[:,(df.isnull().sum(0)<=1)|(df.isnull().sum(0)==len(df))]
Out[415]: 
     B   C  D
0  2.0 NaN  0
1  4.0 NaN  1
2  NaN NaN  5

编辑:

df.loc[:,(df.isnull().sum(0)<=1)|(df.isnull().all(0))]

答案 2 :(得分:2)

另一种看法将其他答案中的一些概念融合在一起。

df.loc[:, df.isnull().assign(C=False).sum().lt(2)]

     B   C  D
0  2.0 NaN  0
1  4.0 NaN  1
2  NaN NaN  5