[英]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.