Объединить и объединить 2 столбца разных фреймов данных

У меня есть 2 кадра данных:

ID             word
1              srv1
2              srv2
3              srv1
4              nan
5              srv3
6              srv1
7              srv5
8              nan
ID             word
1              nan
2              srv12
3              srv10
4              srv8
5              srv4
6              srv7
7              nan
8              srv9

Мне нужно объединить эти 2 кадра данных по идентификатору и объединить слово столбца, чтобы получить:

ID             word
1              srv1 
2              srv2 , srv12
3              srv1 , srv10
4              srv8
5              srv3 , srv4
6              srv1 , srv7
7              srv5
8              srv9

Со следующим кодом

merge = pandas.merge(df1,df2,on = "ID",how = "left")
merge["word"] = merge[word_x] + " , " + merge["word_y"]

Я осознаю:

ID             word
1              nan 
2              srv2 , srv12
3              srv1 , srv10
4              nan
5              srv3 , srv4
6              srv1 , srv7
7              nan
8              nan

Что это не правильное решение.

Похоже, это делает со мной то, что я ожидал... Что вы хотите, чтобы произошло с nan?

Kevin Glasson 02.07.2019 15:08

когда у вас есть nan, добавление будет разрешено nan, поэтому убедитесь, что вы делаете merge + merge только для значений, отличных от nan

Yuca 02.07.2019 15:10
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
2
140
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Вы можете использовать Series.str.cat и параметр na_rep для заполнения столбца word, даже если один из исходных столбцов находится в nan, а затем использовать str.strip для обрезки любых начальных/конечных ' , ' не между словами.

m['word'] = m['word_x'].str.cat(m['word_y'], sep=' , ', na_rep='').str.strip(' , ')

возвращается

   ID word_x word_y          word
0   1   srv1    NaN          srv1
1   2   srv2  srv12  srv2 , srv12
2   3   srv1  srv10  srv1 , srv10
3   4    NaN   srv8          srv8
4   5   srv3   srv4   srv3 , srv4
5   6   srv1   srv7   srv1 , srv7
6   7   srv5    NaN          srv5
7   8    NaN   srv9          srv9

Спасибо отличное решение!

Catapultaa 02.07.2019 15:32

Основываясь на том, что, как я думаю, вы хотите сделать, я бы сначала избавился от этих nan:

df_1.fillna(value = "")
df_2.fillna(value = "")

А потом я снова попробую слияние и посмотрю, получишь ли ты то, что хочешь.

вы можете использовать np.select для выбора существующего значения или составного значения.

попробуй это:

import pandas as pd
import numpy as np
from io import StringIO

df1 = pd.read_csv(StringIO("""
ID             word
1              srv1
2              srv2
3              srv1
4              nan
5              srv3
6              srv1
7              srv5
8              nan"""), sep=r"\s+")

df2 = pd.read_csv(StringIO("""
ID             word
1              nan
2              srv12
3              srv10
4              srv8
5              srv4
6              srv7
7              nan
8              srv9"""), sep=r"\s+")


conditions = [(~df1["word"].isna()) & df2["word"].isna(), df1["word"].isna() & (~df2["word"].isna()), (~df1["word"].isna()) & (~df2["word"].isna())]
choices = [df1["word"], df2["word"], df1["word"] + "," + df2["word"]]

df1["word"] = np.select(conditions,choices)

print(df1)

Выход:

   ID        word
0   1        srv1
1   2  srv2,srv12
2   3  srv1,srv10
3   4        srv8
4   5   srv3,srv4
5   6   srv1,srv7
6   7        srv5
7   8        srv9

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