假设我有这个数据帧:
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并取最大值:
In [177]: my_df.fillna("").groupby("D").max()
Out[177]:
A B C
D
id1 gate car edge
id2 ball
是否有另一种没有fillna(“”)的解决方案?
答案 0 :(得分:5)
将自定义函数与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
答案 1 :(得分:2)
我猜你的方法要好得多,但最后添加一个替换
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