繁体   English   中英

合并具有两个键列和重复键出现(熊猫)的数据框

[英]Merging dataframes with two key columns and repeated keys occurences (pandas)

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

数据框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包含字符串,以防上游出现问题,然后在那里修复它或稍后再强制返回整数。

使用outer联接

In [1266]: df1.merge(df2, how='outer', on=['a','b'])
Out[1266]:
   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 [1267]: df1
Out[1267]:
   a  b    x
0  0  0  100
1  0  1  101
2  0  2  102
3  1  1  103

In [1268]: df2
Out[1268]:
   a  b  y
0  0  0  C
1  0  1  A
2  0  1  B
3  1  1  C
4  1  1  D

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM