#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
правило должно быть примерно таким:
- если A и B отличаются, напишите B
- если B равно NaN, напишите
- если 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