Как объединить данные из двух столбцов в один со знаком + с помощью панд

У меня есть 2 столбца в этом формате в csv.

Drug    Product(Predicted)
#N/A    acetaldehyde
#N/A    nicotine
#N/A    resin
#N/A    rosa
#N/A    eliglustat
#N/A    valpromide
#N/A    clostridium
#N/A    ambenonium
solution    valpromide
solution    valpromide
solution    valpromide
solution    valpromide
solution    valpromide
solution    valpromide
solution    valpromide
solution    valpromide
solution    valpromide
#N/A    amiloride
#N/A    valsartán
#N/A    manitol
#N/A    hipromelosa
#N/A    fosfato disódico
#N/A    fosfato disódico
#N/A    agalsidase beta
#N/A    enoxaparin sodium
solution    warfarine
#N/A    eliglustat
#N/A    silver
#N/A    silver

Результат, который я ищу, заключается в том, что создайте новый столбец и всякий раз, когда в столбце наркотиков присутствует запись (игнорируйте все N/A), добавьте эту запись в новый столбец, объединив 2 столбца со знаком плюс и получите выходной CSV

Например:

New column
solution + valpromide
solution + valpromide
solution + warfarine

Я новичок в пандах, поэтому я хотел знать, как это можно сделать, используя тот же

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
83
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Используйте Series.str.cat с Series.str.strip:

df['new'] = df['Drug'].str.cat(df['Product(Predicted)'], na_rep='', sep='+').str.strip('+')

Или замените отсутствующие значения пустыми строками перед слиянием:

df['new'] = (df['Drug'].fillna('') + '+' + df['Product(Predicted)']).str.strip('+')

print (df)
       Drug Product(Predicted)                  new
0       NaN       acetaldehyde         acetaldehyde
1       NaN           nicotine             nicotine
2       NaN              resin                resin
3       NaN               rosa                 rosa
4       NaN         eliglustat           eliglustat
5       NaN         valpromide           valpromide
6       NaN        clostridium          clostridium
7       NaN         ambenonium           ambenonium
8  solution         valpromide  solution+valpromide
9  solution         valpromide  solution+valpromide

Если вы хотите удалить строки с NaNs в столбце drug:

df1 = df.dropna(subset=['Drug'])
df1['new'] = df1['Drug'] + '+' + df1['Product(Predicted)']
print (df)
       Drug Product(Predicted)                  new
8  solution         valpromide  solution+valpromide
9  solution         valpromide  solution+valpromide

@BilzzM - Вам нужен последний абзац? Удалить эти строки? Или нужно вывести NaN с помощью df['new'] = df['Drug'].str.cat(df['Product(Predicted)'], sep='+')?

jezrael 09.04.2019 08:45

Мне просто нужна конкатенированная строка для каждой строки, которая не содержит NA.

Bilzz M 09.04.2019 08:48

@BilzzM - Да, а что будет со строками, если у drug есть NaNs?

jezrael 09.04.2019 08:49

@BilzzM - есть 3 возможных решения - удалить эти строки в моем последнем абзаце, или игнорировать их, как мой первый абзац, или остаться NaN в выходном столбце на df['new'] = df['Drug'].str.cat(df['Product(Predicted)'], sep='+')

jezrael 09.04.2019 08:50

поэтому только лекарства содержат NaN. Поэтому всякий раз, когда в колонке о наркотиках есть NaN, я просто хочу игнорировать это. Пробую ваши решения, большое спасибо :)

Bilzz M 09.04.2019 08:50

Еще одно сомнение, на самом деле я изменил свой CSV и добавил еще один столбец с именем файла. Что я хочу сделать, так это сохранить имя файла в виде отдельного столбца, чтобы отслеживать имена файлов, для которых я получаю вывод (конкатенированная строка). Итак, я не хочу объединять столбец имени файла, но хочу, чтобы он был отдельным столбцом в моем CSV. Любая идея о том, как это сделать?

Bilzz M 09.04.2019 09:21

@BilzzM - Не уверен, что понял, потому что мой код не объединяет столбцы filename, не использовал его. Так что, если добавить его, нет никаких изменений. Или чего-то не хватает? Как мой код может повлиять на столбец filename?

jezrael 09.04.2019 09:23

Я спрашиваю, я добавил третий столбец под названием «Имена файлов». Итак, что я хочу узнать в своем выходном csv, так это имена файлов, для которых у меня есть конкатенированные строки, то есть df1['new']. Как вывести это в csv, сохранив имена файлов в одном столбце и df1['new'] в другом столбце

Bilzz M 09.04.2019 09:32

Да, так что используйте df[['Filename','new']].to_csv(file, index=False)

jezrael 09.04.2019 09:33

Если я это сделаю, df1['new'] = df1['Drug'] + '+' + df1['Product(Predicted)'] + df1['Filename'], я получу одну строку, содержащую все, кроме df1[ «Имя файла»] в виде отдельного столбца в csv

Bilzz M 09.04.2019 09:34

@BilzzM - Значит, не работает df1[['Filename','new']].to_csv(file, index=False)? Он фильтрует только столбцы Filename и new и записывает в csv

jezrael 09.04.2019 09:37

Если у вас нет нулевых значений в вашем фрейме данных, упомянутых как нулевые, я предлагаю вам сделать следующее:

df["drug"].replace("#N/A", np.nan, inplace = True)

Как только вы заменили отсутствующие значения на null, ответ будет состоять из одной строки кода.

df["new_col"] = df["drug"] + " + " + df["Product"]

Приведенный выше код вернет значение null, если любой из столбцов, продуктов или лекарств имеет значение null.

Надеюсь это поможет.

Другие вопросы по теме