df 根据另一个列的 groupby 搜索空列?

问题描述 投票:0回答:1

寻找输入。试图找到其他 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

python dataframe null nan
1个回答
0
投票

您可以在

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
© www.soinside.com 2019 - 2024. All rights reserved.