Объединить значения столбца фрейма данных Pandas в новый столбец

Я работаю с Pandas, и у меня есть кадр данных, где мы можем иметь одно из трех значений:

ID_1    ID_2    ID_3
abc     NaN     NaN
NaN     def     NaN
NaN     NaN     ghi
NaN     NaN     jkl
NaN     mno     NaN
pqr     NaN     NaN

И моя цель - объединить эти три столбца в новые столбцы в моем кадре данных:

ID_1    ID_2    ID_3  Combined_ID
abc     NaN     NaN    abc
NaN     def     NaN    def
NaN     NaN     ghi    ghi
NaN     NaN     jkl    jkl
NaN     mno     NaN    mno
pqr     NaN     NaN    pqr

В идеале он просто найдет то, что не имеет значения null в столбцах с 1 по 3, но я мог бы также конкатенировать, так как мы должны иметь только одну из трех, заполненных для каждой строки. Спасибо.

df_note = pd.read_csv("NoteIds.csv")
df_note['Combined_ID'] = # ID_1 + ID_2 + ID_3

Ответ 1

Вы можете использовать свойство, которое суммирует, будет конкатенировать строковые значения, чтобы вы могли вызвать fillna и передать пустую строку и вызов sum и передать param axis=1 для суммирования по строке:

In [26]:

df['Combined_ID'] = df.fillna('').sum(axis=1)
df
Out[26]:
  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

Если вас интересуют только эти 3 столбца, вы можете просто выбрать их:

In [39]:

df['Combined_ID'] = df[['ID_1','ID_2','ID_3']].fillna('').sum(axis=1)
df
Out[39]:
  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

Ответ 2

Предположим, что в строке может быть больше одного значения, отличного от 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)