【问题标题】:Merging dataframes with two key columns and repeated keys occurences (pandas)合并具有两个键列和重复键出现的数据框(熊猫)
【发布时间】:2018-08-03 19:34:31
【问题描述】:

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

数据框 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

【问题讨论】:

  • 你说你尝试了四种不同的方法;你确定你试过outer
  • 是的,我将结果添加到问题中
  • 我无法重现您的结果。您能否将A.info()B.info() 的结果编辑到您的问题中?
  • 完成...我真的不明白为什么它不适合我(熊猫/python中的新手)
  • 我明白了...新手错误...我正在从一个调用整数和字符串列表的 np.array 制作我的 B 数据帧....

标签: python pandas merge


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-26
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2015-02-03
      • 1970-01-01
      • 2020-09-04
      • 2021-07-31
      相关资源
      最近更新 更多