代码之家  ›  专栏  ›  技术社区  ›  thanasissdr

在熊猫聚集中应用过滤器

  •  1
  • thanasissdr  · 技术社区  · 6 年前

    假设我有以下内容 pd.DataFrame .

    import pandas as pd
    import numpy as np
    
    data = {'number': [1, 1, 1, 2],  'q':[np.nan, 2, np.nan, 1], 'letter': ['alpha', 'beta', 'gamma', 'alpha']}
    df = pd.DataFrame(data)
    
       number   q   letter
    0   1      NaN   alpha
    1   1      2.0   beta
    2   1      NaN   gamma
    3   2      1.0   alpha
    

    我要做的是按数字聚合并创建一个包含所有字母的列表,然后根据 q .

    如果我这样做:

    df.groupby('number').agg({"letter": lambda w: list(w) }) 收益率:

        letter
    number  
    1   [alpha, beta, gamma]
    2   [alpha]
    

    但是我只想包括列,这样相应的 Q 价值不是 NaN ,即

      number    letter
    0   1       [beta]
    1   2       [alpha]
    

    编辑 :我希望有一个更通用的解决方案(不仅仅是 值),但如果要指定 Q 作为将要包含或不包含内容的阈值。

    1 回复  |  直到 6 年前
        1
  •  3
  •   jezrael    6 年前

    我认为需要 DataFrame.dropna :

    df1 = df.dropna().groupby('number').agg({"letter": lambda w: list(w)})
    

    如果需要,请为删除缺少的值指定列:

    df1 = df.dropna(subset=['q']).groupby('number').agg({"letter": lambda w: list(w)})
    print (df1)
             letter
    number         
    1        [beta]
    2       [alpha]
    

    编辑:

    你也可以过滤 query :

    df1 = df.query("q > 0").groupby('number').agg({"letter": lambda w: list(w)})
    

    boolean indexing :

    df1 = df[df['q'] > 0].groupby('number').agg({"letter": lambda w: list(w)})
    
    df1 = df[df['q'].notnull()].groupby('number').agg({"letter": lambda w: list(w)})
    

    Eddi1:

    在函数中也可以进行过滤,以避免丢失不匹配的组:

    def f(x):
        return x.loc[x['q'] > 1, 'letter'].tolist()
    
    df2 = df.groupby('number').apply(f).reset_index(name='val')
    print (df2)
       number     val
    0       1  [beta]
    1       2      []
    
    df1 = df[df['q'] > 1].groupby('number').agg({"letter": lambda w: list(w)})
    print (df1)
            letter
    number        
    1       [beta]