我想知道是否有一种方法可以排除超过 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'之外,执行此阈值处理。
这可能吗?
答案 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