Объединить два столбца с nan на основе условия (python)

#python #concatenation #nan #multiple-conditions

#питон #сцепление #nan #множество условий

Вопрос:

У меня есть два столбца в фрейме данных pandas, которые выглядят следующим образом:

кола Кольб
a a b c
b a c
c NaN
NaN д е ф
NaN NaN

Я хотел бы объединить ColA и ColB таким образом, чтобы

  • если кола находится в ColB, то сохраните ColB
  • если КолЫ нет в ColB, объедините их
  • если любой из них NaN, то сохраните столбец со значениями
  • если оба являются NaN, то сохраните NaN

Как бы я закодировал это на Python таким образом, чтобы желаемый результат выглядел следующим образом:

кола Кольб Кольк
a a b c a b c
b a c в а с
c NaN c
NaN д е ф д е ф
NaN NaN NaN

Обратите внимание, что » a «представляет слово, а» a b c « представляет три слова в текстовой строке

Ответ №1:

ОБНОВЛЕННЫЙ ответ (с использованием фреймов данных pandas): Хорошо, давайте предположим, что вы это сделали:

 import numpy as np import pandas as pd  

и ваш фрейм данных выглядит следующим образом:

 df  ColA ColB 0 a a b c 1 b a c 2 c NaN 3 NaN d e f 4 NaN NaN  

Затем вы определяете свою комбинационную функцию:

 def concat(row):  a = row["ColA"]  b = row["ColB"]  if not pd.isnull(a) and pd.isnull(b):  return a  if pd.isnull(a) and not pd.isnull(b):  return b  if pd.isnull(a) and pd.isnull(b):  return np.nan  if a in b:  return b  else:  return a   b  

и примените его к своему фрейму данных (к каждой строке):

 df.apply(concat, axis="columns")  

что дает такой результат:

 0 a b c 1 ba c 2 c 3 d e f 4 NaN dtype: object  

Конечно, вы все еще можете подумать о том , хотите ли вы выполнить простое объединение с помощью in concat , или вы хотите добавить пробел и т. Д. Вы получаете свой конечный результат,:

 df["ColC"] = df.apply(concat, axis="columns")  

Конец и конец.

Комментарии:

1. Спасибо, Лукас, я обновил вопрос, чтобы указать, что структура данных представляет собой фрейм данных pandas.

2. @ScottC Я соответствующим образом обновил свой ответ.

3. Большое тебе спасибо, Лукас… Я изменил последнюю строку функции concat на : return a » b, и это дает мне результат, необходимый для вывода в строке 1: b a c , Остальная часть была идеальной. Это сделало именно то, что мне было нужно — спасибо. Я бы поддержал ваш ответ, но у меня недостаточно очков репутации.

4. @ScottC Всегда пожалуйста, сынок.