Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 组合列值匹配的两个数据帧_Python_Pandas_Merge - Fatal编程技术网

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
相同的空数据帧?