我想根据一列中的不同值和第二列中计数为零的非nan数据的计数来删除Dataframe中的行。
以下是原始的df:
ColA ColB
0 a 1
1 a 2
2 a NaN
3 a NaN
4 b NaN
5 b NaN
6 b NaN
7 b NaN
8 c 4
9 c 5
10 c 6
11 c NaN我希望新的df删除索引4-7,因为ColA中的'b‘的不同值对ColB=0中的非NaN值有计数
ColA ColB
0 a 1
1 a 2
2 a NaN
3 a NaN
4 c 4
5 c 5
6 c 6
7 c NaN我可以想出几种方法来做到这一点,创建一个不同值的数组,迭代df和数组来获得我需要的东西,但我希望得到更干净的东西。
有什么想法吗?
发布于 2021-08-19 05:00:35
通过groupby()+transform()检查列'ColB‘是否为NaN,因为它提供了真/假的布尔级数,因此您可以按df’‘ColA’分组,并将第一次出现的真/假转换为整个组,然后在过滤后使用reset_index()删除索引
df[df['ColB'].notna().groupby(df['ColA']).transform('first')].reset_index(drop=True)
#you can also use .loc[]输出:
ColA ColB
0 a 1.0
1 a 2.0
2 a NaN
3 a NaN
4 c 4.0
5 c 5.0
6 c 6.0
7 c NaN发布于 2021-08-19 05:05:26
我们还可以结合使用groupby transform和any来选择包含"any“有效值的组,然后选择reset_index
df = df[
df['ColB'].notna().groupby(df['ColA']).transform('any')
].reset_index(drop=True)或者德摩根的等价物,不是所有的NaN
df = df[
~df['ColB'].isna().groupby(df['ColA']).transform('all')
].reset_index(drop=True)df
ColA ColB
0 a 1.0
1 a 2.0
2 a NaN
3 a NaN
4 c 4.0
5 c 5.0
6 c 6.0
7 c NaNhttps://stackoverflow.com/questions/68842229
复制相似问题