删除包含NaN的列

时间:2016-06-15 19:22:46

标签: python numpy pandas

我有一个类似于这个的DataFrame

             A    M    DM   BYN    Z
2015-01-02   3.   7.  NaN    2.    8.
2015-01-03   1.  NaN   2.    8.    3.
...
2016-06-14   3.   1.   7.   NaN    2.
2016-06-15   1.  NaN   2.    8.    3.

我的实际DataFrame包含超过500列和超过一年的历史记录。

我想:

  1. 删除最后一行包含NaN
  2. 的列
  3. 或者,删除最后5行中至少有NaN的列
  4. 我能够识别包含NaN的列:

    df.isnull().sum(axis=0)
    

    但我无法在上述情况下删除列。

    有人可以帮忙吗?

2 个答案:

答案 0 :(得分:4)

pandas只为此dropna提供了一种方法:

In [21]: df.dropna(axis=1, how='any')
Out[21]:
              A    Z
2015-01-02  3.0  8.0
2015-01-03  1.0  3.0
2016-06-14  3.0  2.0
2016-06-15  1.0  3.0

您可以使用〜(不是)any

In [11]: df.loc[:, ~df.isnull().any()]
Out[11]:
              A    Z
2015-01-02  3.0  8.0
2015-01-03  1.0  3.0
2016-06-14  3.0  2.0
2016-06-15  1.0  3.0

虽然这可能是更好的写作,但并非如此:

In [12]: df.loc[:, df.notnull().all()]
Out[12]:
              A    Z
2015-01-02  3.0  8.0
2015-01-03  1.0  3.0
2016-06-14  3.0  2.0
2016-06-15  1.0  3.0
  

将列放在最后5行中至少有NaN的位置

您可以在DataFrame的最后一行(tail)上使用它:

df.loc[:, df.tail(5).notnull().all()]

答案 1 :(得分:2)

要仅保留最后一行没有缺失值的列,即删除那些缺少值的列,您可以使用否定的.isnull()(或.notnull())在列上创建boolean index

df.loc[:, ~df.iloc[-1].isnull()]
df.loc[:, df.iloc[-1].notnull()]

仅使用样本数据的前两行:

              A   DM  BYN    Z
2015-01-02  3.0  NaN  2.0  8.0
2015-01-03  1.0  2.0  8.0  3.0

对于最后五行,只保留不存在至少一个nan值的列,您将添加.any().all(),具体取决于您是否使用{{{ 1}}或.isnull()

.notnull()