Python 组合列值匹配的两个数据帧
我有两个包含类似列的数据帧:Python 组合列值匹配的两个数据帧,python,pandas,merge,Python,Pandas,Merge,我有两个包含类似列的数据帧: ID prop1 1 UUU &&& 2 III *** 3 OOO ))) 4 PPP %%% 及 我需要在ID匹配的地方合并这两个数据帧,并将prop2列添加到原始数据帧中 ID prop1 prop1 1 UUU &&& 1234 2 III *** 7890 3 OOO ))) 3456 4 PPP %%% 9012 我尝试了merge、join、concat、for、iter等
ID prop1
1 UUU &&&
2 III ***
3 OOO )))
4 PPP %%%
及
我需要在ID匹配的地方合并这两个数据帧,并将prop2列添加到原始数据帧中
ID prop1 prop1
1 UUU &&& 1234
2 III *** 7890
3 OOO ))) 3456
4 PPP %%% 9012
我尝试了merge、join、concat、for、iter等的每种组合。它要么无法合并,要么丢失索引,要么直接删除列值。您可以使用:
输出:
ID prop1 prop2
0 UUU &&& 1234
1 III *** 7890
2 OOO ))) 3456
3 PPP %%% 9012
ID prop1 prop2
index
1 UUU &&& 1234
2 III *** 7890
3 OOO ))) 3456
4 PPP %%% 9012
ID prop1 prop2
1 UUU &&& 1234
2 III *** 7890
3 OOO ))) 3456
4 PPP %%% 9012
您还可以按如下方式使用:
df1.merge(df2, on='ID')
同样的结果
无论使用pd.merge()
还是df.merge()
时,.merge()
上的默认参数都是how='inner'
。因此,您已经在执行内部联接,而没有指定how=
参数
更复杂的情况:
如果您需要更复杂的情况来维护df1
1,2,3,4
的索引而不是0,1,2,3
,您可以在合并前重置索引,然后在重置索引时生成的临时索引列上设置索引:
df1.reset_index().merge(df2, on='ID').set_index('index')
输出:
ID prop1 prop2
0 UUU &&& 1234
1 III *** 7890
2 OOO ))) 3456
3 PPP %%% 9012
ID prop1 prop2
index
1 UUU &&& 1234
2 III *** 7890
3 OOO ))) 3456
4 PPP %%% 9012
ID prop1 prop2
1 UUU &&& 1234
2 III *** 7890
3 OOO ))) 3456
4 PPP %%% 9012
现在,保留原始df1
的索引1234
或者,如果不希望轴标签索引
显示在行索引的顶部,可以执行以下操作:
df1.reset_index().merge(df2, on='ID').set_index('index').rename_axis(index=None)
输出:
ID prop1 prop2
0 UUU &&& 1234
1 III *** 7890
2 OOO ))) 3456
3 PPP %%% 9012
ID prop1 prop2
index
1 UUU &&& 1234
2 III *** 7890
3 OOO ))) 3456
4 PPP %%% 9012
ID prop1 prop2
1 UUU &&& 1234
2 III *** 7890
3 OOO ))) 3456
4 PPP %%% 9012
您可以使用:
输出:
ID prop1 prop2
0 UUU &&& 1234
1 III *** 7890
2 OOO ))) 3456
3 PPP %%% 9012
ID prop1 prop2
index
1 UUU &&& 1234
2 III *** 7890
3 OOO ))) 3456
4 PPP %%% 9012
ID prop1 prop2
1 UUU &&& 1234
2 III *** 7890
3 OOO ))) 3456
4 PPP %%% 9012
您还可以按如下方式使用:
df1.merge(df2, on='ID')
同样的结果
无论使用pd.merge()
还是df.merge()
时,.merge()
上的默认参数都是how='inner'
。因此,您已经在执行内部联接,而没有指定how=
参数
更复杂的情况:
如果您需要更复杂的情况来维护df1
1,2,3,4
的索引而不是0,1,2,3
,您可以在合并前重置索引,然后在重置索引时生成的临时索引列上设置索引:
df1.reset_index().merge(df2, on='ID').set_index('index')
输出:
ID prop1 prop2
0 UUU &&& 1234
1 III *** 7890
2 OOO ))) 3456
3 PPP %%% 9012
ID prop1 prop2
index
1 UUU &&& 1234
2 III *** 7890
3 OOO ))) 3456
4 PPP %%% 9012
ID prop1 prop2
1 UUU &&& 1234
2 III *** 7890
3 OOO ))) 3456
4 PPP %%% 9012
现在,保留原始df1
的索引1234
或者,如果不希望轴标签索引
显示在行索引的顶部,可以执行以下操作:
df1.reset_index().merge(df2, on='ID').set_index('index').rename_axis(index=None)
输出:
ID prop1 prop2
0 UUU &&& 1234
1 III *** 7890
2 OOO ))) 3456
3 PPP %%% 9012
ID prop1 prop2
index
1 UUU &&& 1234
2 III *** 7890
3 OOO ))) 3456
4 PPP %%% 9012
ID prop1 prop2
1 UUU &&& 1234
2 III *** 7890
3 OOO ))) 3456
4 PPP %%% 9012
您还可以使用.map
将prop2值添加到原始数据帧,其中ID列值匹配
df1['prop2'] = df1['ID'].map(dict(df2[['ID', 'prop2']].to_numpy())
如果原始数据帧中有任何ID不在第二个数据帧中(因此没有prop2值),您可以通过添加.fillna()
来填补这些漏洞
df1['prop2'] = df1['ID'].map(dict(df2[['ID', 'prop2']].to_numpy()).fillna(your_fill_value_here)
您还可以使用.map
将prop2值添加到原始数据帧,其中ID列值匹配
df1['prop2'] = df1['ID'].map(dict(df2[['ID', 'prop2']].to_numpy())
如果原始数据帧中有任何ID不在第二个数据帧中(因此没有prop2值),您可以通过添加.fillna()
来填补这些漏洞
df1['prop2'] = df1['ID'].map(dict(df2[['ID', 'prop2']].to_numpy()).fillna(your_fill_value_here)
当你在一个不是索引的级别上进行合并时,带上索引是毫无意义的——如果有一个匹配项,你应该使用哪个索引,从左
的索引还是从右
的索引?这是正确的,熊猫只需在结果上放一个Int64Index
。如果你需要带上索引,那么你需要带上它当你在一个不是索引的级别上进行合并时,带上索引是没有意义的——如果有匹配的话,那么应该使用哪个索引,从左边的
还是从右边的
?正确地说,熊猫只会在结果上放一个Int64Index
。如果你需要带上索引然后,您需要在合并之前将其放入列中。不知何故,这只会返回一个空值dataframe@cdubbs您必须重新分配到df1
例如:df1=df1.reset_index().merge(df2,on='ID')。set_index('index')。重命名_轴(index=None)
或指定一个新名称。@cdubbs我假设df1
是第一个数据帧,df2
是第二个数据帧。这就是您给它们命名的名称。如果不是,用您的数据帧名称替换df1、df2。@cdubbs我通过创建测试数据帧进行测试:df1=pd.dataframe({'ID':{1:'uu',2:'III',3:'oo 4:'PPP'},'prop1':{1:'&&&&',2:'***',3:'),'4:'%%}}
和df2=pd.DataFrame({'ID':{1:'UUU',2:'WWW',3:'III',5:'EEE',6:'oo',7:'RRR',8:'PPP'},'prop2':{1:1234,2:4567,3:7890,5:123,6:3456,7:6789,8:9012})
测试数据帧对我来说很好,它们应该与您的示例数据相同。您好@cdubbs,现在可以了吗?如果否,是否存在与在上面的注释中使用我的代码定义df1
df2
相同的空数据帧?不知何故,这只是返回一个空数据帧dataframe@cdubbs您必须重新分配到df1
例如:df1=df1.reset_index().merge(df2,on='ID')。set_index('index')。重命名_轴(index=None)
或分配给新名称。@cdubbs我假设df1
是第一个数据帧,df2
是第二个数据帧。这就是你给他们起的名字吗。如果没有,请用您的数据帧名称替换df1、df2。@CDUBB我通过以下方式创建测试数据帧进行测试:df1=pd.dataframe({'ID':{1:'UUU',2:'oo',4:'PPP'},'prop1':{1:'&&&',2:'***',3:'))',4:'%%})
和df2=pd.dataframe({'ID':{1:'uu',2:'WWW',3:'III',5:'EEE',6:'oo 8:'PPP'},'prop2':{1:1234,2:4567,3:7890,5:123,6:3456,7:6789,8:9012}})
测试数据帧对我来说很好,它们应该与您的示例数据相同。Hi@cdubbs现在可以了吗?如果否,是否存在与在上述注释中使用我的代码定义df1
df2
相同的空数据帧?