Python 合并并合并不同数据帧的两列
我有两个数据帧:Python 合并并合并不同数据帧的两列,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,我有两个数据帧: ID word 1 srv1 2 srv2 3 srv1 4 nan 5 srv3 6 srv1 7 srv5 8 nan 我需要的是合并ID上的2个数据帧,并合并列word以获得: ID word 1
ID word
1 srv1
2 srv2
3 srv1
4 nan
5 srv3
6 srv1
7 srv5
8 nan
我需要的是合并ID上的2个数据帧,并合并列word以获得:
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”)
合并[“单词”]=合并[单词x]+,“+合并[“单词y”]
我得到:
ID word
1 nan
2 srv2 , srv12
3 srv1 , srv10
4 nan
5 srv3 , srv4
6 srv1 , srv7
7 nan
8 nan
这不是正确的解决方案。您可以使用和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="")
然后我会再次尝试合并,看看是否得到所需的值。您可以使用选择现有值或连接的值
试试这个:
将熊猫作为pd导入
将numpy作为np导入
从io导入StringIO
df1=pd.read\U csv(StringIO(“”)
ID字
1 srv1
2 srv2
3 srv1
4楠
5 srv3
6 srv1
7 srv5
8 nan“”,sep=r“\s+”)
df2=pd.read\U csv(StringIO(“”)
ID字
1楠
2 srv12
3 srv10
4 srv8
5 srv4
6 srv7
7南
8 srv9“”,sep=r“\s+”)
条件=[(~df1[“word”].isna())和df2[“word”].isna(),df1[“word”].isna()&(~df2[“word”].isna()),(~df1[“word”].isna())和(~df2[“word”].isna())]
选项=[df1[“word”]、df2[“word”]、df1[“word”]+、“+df2[“word”]]
df1[“word”]=np.select(条件、选项)
打印(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
?当您有nan
时,添加的内容将解析为nan
,因此请确保您只对非nan
值执行merge
+merge
,这是一个很好的解决方案!
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