如何从新列中完全省略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来确定要编写哪个代码?性能方面的考虑?
答案 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