Объединить несколько столбцов в 1 в pandas [duplicate]

12
задан EMC 21 April 2015 в 20:52
поделиться

3 ответа

Вы можете использовать свойство, которое суммирует, будет конкатенировать строковые значения, поэтому вы могли бы вызвать 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
12
ответ дан EdChum 28 August 2018 в 01:56
поделиться

Другой способ:

df['Combined_ID'] = df.ID_1.fillna('') + df.ID_2.fillna('') + df.ID_3.fillna('')

Выход:

  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
0
ответ дан Joe 28 August 2018 в 01:56
поделиться

Предположим, что в строке может быть больше одного значения, отличного от 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)
3
ответ дан Zero 28 August 2018 в 01:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: