将数据框列加在一起,考虑NaN并以列分隔

时间:2018-07-31 14:36:51

标签: python pandas join

如何从新列中完全省略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”,   根据以下说明,无法将输入安全地强制转换为任何受支持的类型   强制转换规则“ safe””,“发生在索引0”)

编辑: 您的答案都有效。为了获得答案,我将使用哪个critera来确定要编写哪个代码?性能方面的考虑?

2 个答案:

答案 0 :(得分:2)

您可以使用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

答案 1 :(得分:1)

您可以在dropna中使用apply,例如:

df.apply(lambda x: ','.join(x.dropna()), axis = 1)

使用df的@Wen输入,如果您比较小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