df 根据另一个 col 的 groupby 搜索 null cols?

df search for null cols based on groupby of another col?

提问人:surfer349 提问时间:4/26/2023 最后编辑:surfer349 更新时间:4/28/2023 访问量:57

问:

寻找输入。试图查找具有其他 cols 人口组之一 null 的 col.....就像一台机器的传感器停止工作一样。

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% 测试放在一起,但它只是将该列的所有行放在一起。即使 GroubB 具有有效数据,如何测试 GroupA 的所有行是否都为 null?

例如:col1 未通过 85% 测试,但 col3 未通过。我想将 col3 识别为失败并删除该 col

python 数据帧 null nan

评论

1赞 Andrej Kesely 4/26/2023
您能否编辑您的问题并放在那里样本(小)数据和预期输出?

答:

0赞 Nick 4/28/2023 #1

您可以在聚合中使用类似的逻辑来确定要删除的列: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

请注意,对于样本数据,每个组的比率仅为 80%,因此不符合测试。col1

现在,您可以使用逻辑 OR 每列的值: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