Объединить два столбца строковых данных в один с правилом выбора

#python #pandas

#python #pandas

Вопрос:

Мне нужно объединить два столбца строковых данных в один (в одном и том же фрейме данных), также мне нужно какое-то правило выбора, я привожу вам пример

   import numpy as np
    import pandas as pd
    df = pd.DataFrame({'nameA':['martin', 'peter', 'john', 'tom', 'bill'], 
                       'nameB':[ np.NaN,np.NaN , 'jhon', 'tomX', 'billX']})
    df

    nameA   nameB
0   martin  NaN
1   peter   NaN
2   john    jhon
3   tom     tomX
4   bill    billX
  

Этот результат является ожидаемым поведением

     nameA   nameB   nameAB
0   martin  NaN     martin
1   peter   NaN     peter
2   john    jhon    jhon
3   tom     tomX    tomX
4   bill    billX   bilX
  

правило должно быть примерно таким:

  1. если A и B отличаются, напишите B
  2. если B равно NaN, напишите
  3. если A и B равны NaN, напишите NaN

Я нашел подсказки с числами, но не со строками, я думаю, мне нужно протестировать строку за строкой и получить значение true или false, а затем записать соответствующее значение

Любые рекомендации или помощь будут с благодарностью!

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

1. Спасибо всем, я действительно ценю это

Ответ №1:

Вы можете использовать df.combine_first() :

 In [1972]: df['nameAB'] = df.nameB.combine_first(df.nameA)

In [1973]: df
Out[1973]: 
    nameA  nameB  nameAB
0  martin    NaN  martin
1   peter    NaN   peter
2    john   jhon    jhon
3     tom   tomX    tomX
4    bill  billX   billX
  

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

1. Да, Маянк, я действительно удивлен, что есть метод, который отвечает на мой вопрос, еще раз спасибо

Ответ №2:

Используйте np.где:

 import pandas as pd
import numpy as np

df = pd.DataFrame({'nameA': ['martin', 'peter', 'john', 'tom', 'bill'],
                   'nameB': [np.NaN, np.NaN, 'jhon', 'tomX', 'billX']})


df['nameAB'] = np.where(pd.isna(df['nameB']), df['nameA'], df['nameB'])

print(df)
  

Вывод

     nameA  nameB  nameAB
0  martin    NaN  martin
1   peter    NaN   peter
2    john   jhon    jhon
3     tom   tomX    tomX
4    bill  billX   billX
  

Учитывая ваши условия, вы возвращаетесь только nameA тогда, когда nameB есть nan .

Ответ №3:

Series.fillna

 df['nameAB'] = df['nameB'].fillna(df['nameA'])
print(df)
  

Вывод

     nameA  nameB  nameAB
0  martin    NaN  martin
1   peter    NaN   peter
2    john   jhon    jhon
3     tom   tomX    tomX
4    bill  billX   billX