Skip to main content
 首页 » 编程设计

python之合并具有两个键列和重复键出现的数据帧( Pandas )

2025年05月04日20jirigala

我正在尝试合并两个具有两个键列的数据集,并且键重复出现,但是,我无法获得我想要的结果。为了简化我这里有一个例子:

数据框 A

   a  b    x 
0  0  0  100 
1  0  1  101 
2  0  2  102 
3  1  1  103 

数据框 B

   a  b  y 
0  0  0  C 
1  0  1  A 
2  0  1  B 
3  1  1  C 
4  1  1  D 

我正在尝试对列“a”和“b”进行左连接合并操作:

C=A.merge(B,how='left',on=['a','b']) 

输出是

数据框 C

   a  b    x    y 
0  0  0  100  NaN 
1  0  1  101  NaN 
2  0  2  102  NaN 
3  1  1  103  NaN 

我真正想要的是:

数据框 C

   a  b    x    y 
0  0  0  100  C 
1  0  1  101  A 
2  0  1  101  B 
3  0  2  102  NaN 
4  1  1  103  C 
5  1  1  103  D 

我尝试了“how=”参数的 4 个不同选项,但没有任何结果。

请注意,在 Dataiku 上,仅使用左连接我得到了这个结果。 我搜索了一个没有成功的解决方案。我希望你能帮我找到它。提前致谢。

乔

Edit1:“外部”选项:

C=pd.merge(A,B,how='outer',on=['a','b']) 
 
C 
Out[241]:  
     a    b      x    y 
0  0.0  0.0  100.0  NaN 
1  0.0  1.0  101.0  NaN 
2  0.0  2.0  102.0  NaN 
3  1.0  1.0  103.0  NaN 
4  0.0  0.0    NaN    C 
5  0.0  1.0    NaN    A 
6  0.0  1.0    NaN    B 
7  1.0  1.0    NaN    C 
8  1.0  1.0    NaN    D 

Edit2:添加有关数据框的详细信息

A.info() 
<class 'pandas.core.frame.DataFrame'> 
RangeIndex: 4 entries, 0 to 3 
Data columns (total 3 columns): 
a    4 non-null int32 
b    4 non-null int32 
x    4 non-null int32 
dtypes: int32(3) 
memory usage: 128.0 bytes 
 
B.info() 
<class 'pandas.core.frame.DataFrame'> 
RangeIndex: 5 entries, 0 to 4 
Data columns (total 3 columns): 
a    5 non-null object 
b    5 non-null object 
y    5 non-null object 
dtypes: object(3) 
memory usage: 200.0+ bytes 

请您参考如下方法:

您的 .info() 输出揭示了问题:您的 a 和 b 列的类型不同。在 A 中,它们是 int32,但在 B 中,它们是对象(几乎肯定是字符串)。例如,如果它们都是整数:

In [32]: A.merge(B, how='left') 
Out[32]:  
   a  b    x    y 
0  0  0  100    C 
1  0  1  101    A 
2  0  1  101    B 
3  0  2  102  NaN 
4  1  1  103    C 
5  1  1  103    D 
 
In [33]: A.merge(B, how='outer') 
Out[33]:  
   a  b    x    y 
0  0  0  100    C 
1  0  1  101    A 
2  0  1  101    B 
3  0  2  102  NaN 
4  1  1  103    C 
5  1  1  103    D 

但是如果 B 包含字符串,我们会重现您的问题:

In [35]: A.merge(B.astype(str), how='left') 
Out[35]:  
   a  b    x    y 
0  0  0  100  NaN 
1  0  1  101  NaN 
2  0  2  102  NaN 
3  1  1  103  NaN 
 
In [36]: A.merge(B.astype(str), how='outer') 
Out[36]:  
     a    b      x    y 
0  0.0  0.0  100.0  NaN 
1  0.0  1.0  101.0  NaN 
2  0.0  2.0  102.0  NaN 
3  1.0  1.0  103.0  NaN 
4  0.0  0.0    NaN    C 
5  0.0  1.0    NaN    A 
6  0.0  1.0    NaN    B 
7  1.0  1.0    NaN    C 
8  1.0  1.0    NaN    D 

弄清楚为什么你的 B 包含字符串,以防上游出现问题,然后在那里修复它或稍后强制恢复为整数。