簡體   English   中英

如何在 Pandas 數據幀的 groupby 中刪除 NaN 元素?

[英]How to drop NaN elements in a groupby on a pandas dataframe?

假設我有這個數據框:

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

我的解決方案是用空字符填充NaN並取max

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

有沒有沒有fillna("")另一種解決方案?

將自定義函數與dropna一起dropna ,但對於空值添加NaN

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

我猜你的方法要好得多,但最后添加一個替換

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM