代码之家  ›  专栏  ›  技术社区  ›  G F

如何将groupby中的NaN元素放到pandas数据帧上?

  •  4
  • G F  · 技术社区  · 8 年前

    假设我有这个数据帧:

    my_df = pd.DataFrame({'A':[np.nan,np.nan,'gate','ball'],'B':['car',np.nan,np.nan,np.nan],'C':[np.nan,'edge',np.nan,np.nan],'D':['id1','id1','id1','id2']})
    
    In [176]: my_df
    Out[176]:
      A    B     C    D
    0   NaN  car   NaN  id1
    1   NaN  NaN  edge  id1
    2  gate  NaN   NaN  id1
    3  ball  NaN   NaN  id2
    

    我想按列分组 D 忽略 NaN . 预期输出:

            A    B     C
    D
    id1  gate  car  edge
    id2  ball  NaN  NaN
    

    我的解决方案是填补 楠 使用空字符并获取 max :

    In [177]: my_df.fillna("").groupby("D").max()
    Out[177]:
        A    B     C
    D
    id1  gate  car  edge
    id2  ball
    

    fillna("") ?

    2 回复  |  直到 5 年前
        1
  •  8
  •   jezrael    8 年前

    使用自定义函数 dropna ,但对于空值,添加 NaN s:

    print (my_df.groupby("D").agg(lambda x: np.nan if x.isnull().all() else x.dropna()))
            A    B     C
    D                   
    id1  gate  car  edge
    id2  ball  NaN   NaN
    

    具有自定义功能的类似解决方案:

    def f(x):
        y = x.dropna()
        return np.nan if y.empty else y
    
    print (my_df.groupby("D").agg(f))
            A    B     C
    D                   
    id1  gate  car  edge
    id2  ball  NaN   NaN
    
        2
  •  2
  •   Bharath M Shetty    8 年前

    我想你的方法要好得多,但最后添加了一个替换

    my_df.fillna("").groupby("D").max().replace('',np.nan) 
    

    您还可以执行以下操作:

    def get_notnull(x):
        if x.notnull().any():
            return  x[x.notnull()]
        else:
            return np.nan
    
    my_df.groupby('D').agg(get_notnull)
    

    输出:

         A    B     C
    D                   
    id1  gate  car  edge
    id2  ball  NaN   NaN