【问题标题】:Pandas filter values which have both null and not null values in another columnPandas 过滤在另一列中同时具有空值和非空值的值
【发布时间】:2021-05-13 02:57:40
【问题描述】:

我有一个数据框,需要过滤掉第一列中的元素列表,第二列中同时包含空值和非空值。

["1"]   ["2"]    
"A"    "Smthng"      
"B"    "sometext"      
"C"     NULL
"A"     NULL         

对于这种情况,我应该得到A

["1"]   ["2"]    
"A"    "Smthng"  
"A"     NULL         

我这样做了,它正在工作。但也许你知道如何在一行代码中更快地做到这一点。

我做了什么:

NamesWithMissing = df[df['2'].isna()]['1'].tolist()
NamesWithMissing = df[(df['1'].isin(NamesWithMissing)) & (df['2'].notnull())]['1'].tolist()
df[df['1'].isin(NamesWithMissing)].sort_values(by="1")

更新

找到有趣的解决方案:

df.groupby('1').filter(lambda g: (g.nunique() > 1).any())

【问题讨论】:

    标签: python pandas filtering


    【解决方案1】:

    我们可以使用isna 然后groupby 创建一个掩码1transform 列使用nunique 来检查组包含空值和非空值的条件

    df[df['2'].isna().groupby(df['1']).transform('nunique').eq(2)]
    

       1       2
    0  A  Smthng
    3  A     NaN
    

    【讨论】:

      【解决方案2】:

      您可以使用布尔索引:

      m = (
          df.groupby("1")
          .transform(lambda x: (x.isna().sum() >= 1) & (x.notna().sum() >= 1))
          .values
      )
      print(df[m])
      

      打印:

         1       2
      0  A  Smthng
      3  A     NaN
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-12-10
        • 2020-08-10
        • 2019-09-03
        • 1970-01-01
        • 2014-08-12
        • 2021-08-24
        • 2017-08-15
        相关资源
        最近更新 更多