如何在熊猫数据帧上的分组中删除NaN元素?

G F*_*G F 4 python dataframe pandas

假设我有这个数据框:

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
Run Code Online (Sandbox Code Playgroud)

我想按“ D”列分组并忽略NaN。预期产量:

        A    B     C
D
id1  gate  car  edge
id2  ball  NaN  NaN
Run Code Online (Sandbox Code Playgroud)

我的解决方案是用空字符填充NaN并采用最大值:

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

是否有没有fillna(“”)的其他解决方案?

jez*_*ael 6

将自定义函数与一起使用dropna,但对于空值,请添加NaNs:

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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)