Pandas объединить две строки, игнорировать значения nan

У меня есть два столбца со строками. Я хотел бы объединить их и игнорировать значения nan. Таким образом:

ColA, Colb, ColA+ColB
str   str    strstr
str   nan    str
nan   str    str

Я пробовал df['ColA+ColB'] = df['ColA'] + df['ColB'], но это создает значение nan, если любой столбец - nan. Я также думал об использовании concat.

Я полагаю, я мог бы просто пойти с этим, а затем использовать некоторые df.ColA+ColB[df[ColA] = nan] = df[ColA], но это похоже на обходной путь.

Ответ 1

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

In [3]:
df = pd.DataFrame({'a':['asd',np.NaN,'asdsa'], 'b':['asdas','asdas',np.NaN]})
df

Out[3]:
       a      b
0    asd  asdas
1    NaN  asdas
2  asdsa    NaN

In [7]:
df['a+b'] = df.fillna('').sum(axis=1)
df

Out[7]:
       a      b       a+b
0    asd  asdas  asdasdas
1    NaN  asdas     asdas
2  asdsa    NaN     asdsa

Ответ 2

Вы можете заполнить NaN пустой строкой:

df['ColA+ColB'] = df['ColA'].fillna('') + df['ColB'].fillna('')

Ответ 3

Используя apply и str.cat, вы можете

In [723]: df
Out[723]:
       a      b
0    asd  asdas
1    NaN  asdas
2  asdsa    NaN

In [724]: df['a+b'] = df.apply(lambda x: x.str.cat(sep=''), axis=1)

In [725]: df
Out[725]:
       a      b       a+b
0    asd  asdas  asdasdas
1    NaN  asdas     asdas
2  asdsa    NaN     asdsa

Ответ 4

Предпочитаю добавлять столбцы, чем использовать метод apply. Потому что это быстрее, чем apply.

  • Просто добавьте два столбца (если вы знаете, что это строки)

    %timeit df.bio + df.procedure_codes  
    

    21,2 мс ± 1,53 мс на цикл (среднее ± стандартное отклонение из 7 циклов, по 10 циклов в каждом)

  • Используйте применить

    %timeit df[eventcol].apply(lambda x: ''.join(x), axis=1)  
    

    13,6 с ± 343 мс на цикл (среднее ± стандартное отклонение из 7 циклов, по 1 циклу каждый)

  • Используйте строковые методы Pandas и cat:

    %timeit df[eventcol[0]].str.cat(cols, sep=',')  
    

    264 мс ± 12,3 мс на цикл (среднее ± стандартное отклонение из 7 циклов, по 1 циклу каждый)

  • Использование суммы (которая объединяет строки)

    %timeit df[eventcol].sum(axis=1)  
    

    509 мс ± 6,03 мс на цикл (среднее ± стандартное отклонение из 7 циклов, по 1 циклу каждый)

смотрите здесь для дополнительных тестов