Предположим, что в строке может быть больше одного значения, отличного от NaN. Тем не менее это должно работать.
In [43]: df['Combined_ID'] = df.apply(
lambda x : ''.join([e for e in x if isinstance(e, basestring)]),
axis=1)
Для каждой строки извлекайте строковые элементы и присоединяйте их.
In [44]: df
Out[44]:
ID_1 ID_2 ID_3 Combined_ID
0 abc NaN NaN abc
1 NaN def NaN def
2 NaN NaN ghi ghi
3 NaN NaN jkl jkl
4 NaN mno NaN mno
5 pqr NaN NaN pqr
Мне понравился ответ @ EdChum и выглядит более читаемым.
Интересно, что метод fillna('').sum(axis=1)
является дорогостоящим для этих меньших данных.
In [45]: %timeit df.fillna('').sum(axis=1)
1000 loops, best of 3: 808 µs per loop
In [46]: %timeit df.apply(lambda x : ''.join([e for e in x if isinstance(e, basestring)]), axis=1)
1000 loops, best of 3: 285 µs per loop
Только для ['ID_1','ID_2','ID_3']
столбцов
df[['ID_1','ID_2','ID_3']].apply(lambda_function)