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

Python pandas唯一值忽略NaN

  •  20
  • ragesz  · 技术社区  · 8 年前

    我想使用 unique 在里面 groupby nan 唯一的

    数据帧示例:

    df = pd.DataFrame({'a': [1, 2, 1, 1, np.nan, 3, 3], 'b': [0,0,1,1,1,1,1],
        'c': ['foo', np.nan, 'bar', 'foo', 'baz', 'foo', 'bar']})
    
           a  b    c
    0 1.0000  0  foo
    1 2.0000  0  NaN
    2 1.0000  1  bar
    3 1.0000  1  foo
    4    nan  1  baz
    5 3.0000  1  foo
    6 3.0000  1  bar
    

    :

    df.groupby('b').agg({'a': ['min', 'max', 'unique'], 'c': ['first', 'last', 'unique']})
    

           a                             c                      
         min    max           unique first last           unique
    b                                                           
    0 1.0000 2.0000       [1.0, 2.0]   foo  foo       [foo, nan]
    1 1.0000 3.0000  [1.0, nan, 3.0]   bar  bar  [bar, foo, baz]
    

    但我想要没有

           a                        c                      
         min    max      unique first last           unique
    b                                                           
    0 1.0000 2.0000  [1.0, 2.0]   foo  foo            [foo]
    1 1.0000 3.0000  [1.0, 3.0]   bar  bar  [bar, foo, baz]
    

    唯一的 一个接一个的聚合,并与其他聚合分开。

    4 回复  |  直到 4 年前
        1
  •  55
  •   Bharath M Shetty    5 年前

    定义函数:

    def unique_non_null(s):
        return s.dropna().unique()
    

    然后在聚合中使用它:

    df.groupby('b').agg({
        'a': ['min', 'max', unique_non_null], 
        'c': ['first', 'last', unique_non_null]
    })
    
        2
  •  4
  •   zipa    8 年前

    这将满足您的需要:

    df.fillna(method='ffill').groupby('b').agg({'a': ['min', 'max', 'unique'], 'c': ['first', 'last', 'unique']})
    

    min , max unique

        3
  •  2
  •   Bharath M Shetty    5 年前

    2020年11月23日更新

    早期的

    尝试 ffill

    df.ffill().groupby('b').agg({'a': ['min', 'max', 'unique'], 'c': ['first', 'last', 'unique']})
    
          c                          a                 
      first last           unique  min  max      unique
    b                                                  
    0   foo  foo            [foo]  1.0  2.0  [1.0, 2.0]
    1   bar  bar  [bar, foo, baz]  1.0  3.0  [1.0, 3.0]
    

    如果Nan是组的第一个元素,则上述解将中断。

        4
  •  0
  •   R.Sriram    4 年前

    您可以使用以下代码,

        df.apply(lambda x: len(x.dropna().unique()))