将数据帧列添加到一起,由考虑NaN的列分隔



如何从新列中完全省略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