У меня есть 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, добавление будет разрешено nan, поэтому убедитесь, что вы делаете merge + merge только для значений, отличных от nan






Вы можете использовать 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
Спасибо отличное решение!
Основываясь на том, что, как я думаю, вы хотите сделать, я бы сначала избавился от этих 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
Похоже, это делает со мной то, что я ожидал... Что вы хотите, чтобы произошло с
nan?