寻找输入。试图找到其他 cols 人口组之一为 null 的 cols .....就像一台机器的传感器停止工作一样。
Group col1 col2 col3
A NaN 9.94 93.78
A NaN 1.11 50.56
A NaN 6.20 26.18
A 0.13 8.46 92.36
A NaN 5.31 70.67
B NaN 4.56 NaN
B 0.05 4.44 NaN
B NaN 6.36 NaN
B NaN 5.36 NaN
B NaN NaN NaN
#drop cols that have>85% null
nan_cols85 = [i for i in df.columns if df[i].isnull().sum() > 0.85*len(df)]
df.drop(nan_cols85,axis=1, inplace=True)
我已经将这个 85% 的测试放在一起,但它只是将该列的所有行放在一起。我如何测试 GroupA 的所有行是否为空,即使 GroubB 具有有效数据?
例如:col1 未通过 85% 测试,但 col3 没有。我想将 col3 标识为失败并删除该 col
您可以在
groupby
聚合中使用类似的逻辑来确定要删除的列:
nan_groups85 = df.groupby('Group').agg(lambda g:g.isnull().sum() > 0.85*len(g))
#
# col1 col2 col3
# Group
# A False False False
# B False False True
请注意,对于您的示例数据,
col1
中每个组的比率仅为 80%,因此不符合测试条件。
现在您可以使用
any
对每列的值进行逻辑或操作:
nan_cols85 = nan_groups85.any()
#
# col1 False
# col2 False
# col3 True
# dtype: bool
最后我们可以删除值为
True
的列。
df = df.drop([col for col, isnan in nan_cols85.items() if isnan], axis=1)
输出:
Group col1 col2
0 A NaN 9.94
1 A NaN 1.11
2 A NaN 6.20
3 A 0.13 8.46
4 A NaN 5.31
5 B NaN 4.56
6 B 0.05 4.44
7 B NaN 6.36
8 B NaN 5.36
9 B NaN NaN