如何从新列中完全省略NaN值以避免连续逗号?
df['newcolumn'] = df.apply(''.join, axis=1)
一种方法可能是使用条件lambda
df.apply(lambda x: ','.join(x.astype(str)) if(np.isnan(x.astype(str))) else '', axis = 1)
但这会返回一条错误消息:
TypeError:(输入类型不支持"ufunc"isnan"根据强制转换规则"安全","发生在索引0'(
编辑:两个答案都有效。为了获得答案,我将使用什么标准来确定要编码哪一个?性能考虑因素?
您可以使用stack
,因为它将在默认情况下删除NaN
df.stack().groupby(level=0).apply(','.join)
Out[552]:
0 a,t,y
1 a,t
2 a,u,y
3 a,u,n
4 a,u
5 b,t,y
dtype: object
数据输入
df
Out[553]:
Mary John David
0 a t y
1 a t NaN
2 a u y
3 a u n
4 a u NaN
5 b t y
您可以在apply
中使用dropna
,例如:
df.apply(lambda x: ','.join(x.dropna()), axis = 1)
有了@Wen对df的输入,如果你比较小的df,这个稍微快一点
%timeit df.apply(lambda x: ','.join(x.dropna()),1)
1000 loops, best of 3: 1.04 ms per loop
%timeit df.stack().groupby(level=0).apply(','.join)
1000 loops, best of 3: 1.6 ms per loop
但对于更大的数据帧,@Wen的答案是更快的
df_long = pd.concat([df]*1000)
%timeit df_long.apply(lambda x: ','.join(x.dropna()),1)
1 loop, best of 3: 850 ms per loop
%timeit df_long.stack().groupby(level=0).apply(','.join)
100 loops, best of 3: 13.1 ms per loop