是否有 python 函数可以根据 NaN 百分比获取列?

Is there a python function to get columns according to NaN percentage?

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.choice([np.nan,1], p=(0.8,0.2),size=(10,10)))
print (df)
     0    1    2   3    4    5    6   7    8   9
0  NaN  NaN  1.0 NaN  NaN  NaN  NaN NaN  NaN NaN
1  NaN  NaN  NaN NaN  NaN  NaN  NaN NaN  1.0 NaN
2  NaN  NaN  NaN NaN  NaN  NaN  NaN NaN  1.0 NaN
3  1.0  1.0  NaN NaN  NaN  1.0  NaN NaN  1.0 NaN
4  NaN  NaN  NaN NaN  NaN  NaN  1.0 NaN  NaN NaN
5  NaN  NaN  1.0 NaN  NaN  NaN  NaN NaN  NaN NaN
6  1.0  NaN  NaN NaN  1.0  NaN  NaN NaN  1.0 NaN
7  NaN  NaN  NaN NaN  1.0  NaN  1.0 NaN  NaN NaN
8  1.0  NaN  NaN NaN  NaN  NaN  1.0 NaN  NaN NaN
9  NaN  NaN  NaN NaN  1.0  NaN  NaN NaN  NaN NaN

对于上面的 dataframe,获得低于给定 NAN 百分比 (阈值)的 column names 的最简单代码是什么?

要获取低于 30% NaN 的列名称,我可以使用以下代码来完成此操作

col_list = df.dropna(thresh=df.shape[0]*0.3, 
                     how='all', axis=1).columns.to_list()

col_list
[0, 4, 6, 8]

获取此类列名的最简单代码是什么?

如果您只想通过索引来完成,类似的方法应该可行

df.columns[df.isna().sum() / df.shape[0] < 0.3] # columns names
df.loc[:, df.isna().sum() / df.shape[0] < 0.3] # columns with data

因此,计算 nums 的小数,获取它是否低于阈值,并使用 loc 提取相应的列。

你可以做到

df.isna().mean().loc[lambda x : x<0.3]
Out[59]: 
1    0.1
6    0.2
7    0.0
8    0.2
dtype: float64
# df.notna().mean().loc[lambda x : x<0.3].index

选择:

col_list = df.columns[df.count() / df.shape[0] >= 0.3].tolist()
print(col_list)

# Output:
[0, 4, 6, 8]