我有一个类似于这个的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列和超过一年的历史记录。
我想:
我能够识别包含NaN的列:
df.isnull().sum(axis=0)
但我无法在上述情况下删除列。
有人可以帮忙吗?
答案 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()