Python 无法正确合并多个列上的数据库合并

Python 无法正确合并多个列上的数据库合并,python,pandas,merge,dataframe,multiple-columns,Python,Pandas,Merge,Dataframe,Multiple Columns,我遇到了以下问题。我想合并多列上的两个数据帧(确切地说是11列)。令人惊讶的是,通常的方法不起作用。示例数据帧如下所示: df1: df2: 我试过了 结果=pd.merge(df1,df2,how='outer',打开= ['c1','c2','c3','c4','c5','c6'] 这在技术上也应该有效: result=pd.merge(df1,df2,how='outer') 但我明白了: c1 c2 c3 c4 c5 c6 event_count event_type ev

我遇到了以下问题。我想合并多列上的两个数据帧(确切地说是11列)。令人惊讶的是,通常的方法不起作用。示例数据帧如下所示: df1:

df2:

我试过了

结果=pd.merge(df1,df2,how='outer',打开= ['c1','c2','c3','c4','c5','c6']

这在技术上也应该有效:

result=pd.merge(df1,df2,how='outer')

但我明白了:

c1  c2  c3  c4  c5  c6  event_count event_type  event_price
1   2   a   ff  0   1   5       
1   2   b   fg  1   3   6       
1   2   c   hg  2   4   20      
1   2   d   gf  0   1   7       
1   2   e   fg  1   4   1       
1   2   a   ff  0   1               a           20
1   2   b   fg  1   3               a           20
1   2   c   hg  2   4               b           30
1   2   d   gf  0   1               b           40
1   2   e   fg  1   4               b           50
c1  c2  c3  c4  c5  c6  event_count event_type  event_price
1   2   a   ff  0   1   5            a          20
1   2   b   fg  1   3   6            a          20
1   2   c   hg  2   4   20           b          30
1   2   d   gf  0   1   7            b          40
1   2   e   fg  1   4   1            b          50
当我想得到这个:

c1  c2  c3  c4  c5  c6  event_count event_type  event_price
1   2   a   ff  0   1   5       
1   2   b   fg  1   3   6       
1   2   c   hg  2   4   20      
1   2   d   gf  0   1   7       
1   2   e   fg  1   4   1       
1   2   a   ff  0   1               a           20
1   2   b   fg  1   3               a           20
1   2   c   hg  2   4               b           30
1   2   d   gf  0   1               b           40
1   2   e   fg  1   4               b           50
c1  c2  c3  c4  c5  c6  event_count event_type  event_price
1   2   a   ff  0   1   5            a          20
1   2   b   fg  1   3   6            a          20
1   2   c   hg  2   4   20           b          30
1   2   d   gf  0   1   7            b          40
1   2   e   fg  1   4   1            b          50
我还尝试了索引:

df1_索引=df1。设置_索引(['c1','c2','c3'..); df2_索引=df2。集合_索引(['c1','c2','c3'..); 结果=pd.concat([df1_指数,df2_指数],轴=1)

但这也产生了同样的错误结果。我确保两个表的数据类型也相同。我不知道还能尝试什么。有什么建议吗?
谢谢:)

为什么要进行外部联接?就我所知,你需要一个内在的连接。 这个
df1.merge(df2)
给了我:

    c1  c2  c3  c4  c5  c6  event_count event_type  event_price
0   1   2   a   ff  0   1   5              a            20
1   1   2   b   fg  1   3   6              a            20
2   1   2   c   hg  2   4   20             b            30
3   1   2   d   gf  0   1   7              b            40
4   1   2   e   fg  1   4   1              b            50

如果一个数据帧中的值是数字字符串,而另一个数据帧中的值是数字,则可能发生您描述的行为。它们看起来一样,但比较起来却不同

例如,考虑下面的代码> DF1和 DF2下面。它们的

c
列完全相同,只是
df1['c1']
包含字符串,而
df2['c1']
包含int

import pandas as pd
df1 = pd.DataFrame({'c1': ['1', '1', '1', '1', '1'],
 'c2': [2, 2, 2, 2, 2],
 'c3': ['a', 'b', 'c', 'd', 'e'],
 'c4': ['ff', 'fg', 'hg', 'gf', 'fg'],
 'c5': [0, 1, 2, 0, 1],
 'c6': [1, 3, 4, 1, 4],
 'event_count': [5, 6, 20, 7, 1]})

df2 = pd.DataFrame({'c1': [1, 1, 1, 1, 1],
 'c2': [2, 2, 2, 2, 2],
 'c3': ['a', 'b', 'c', 'd', 'e'],
 'c4': ['ff', 'fg', 'hg', 'gf', 'fg'],
 'c5': [0, 1, 2, 0, 1],
 'c6': [1, 3, 4, 1, 4],
 'event_price': [20, 20, 30, 40, 50],
 'event_type': ['a', 'a', 'b', 'b', 'b']})
合并无法匹配任何行,因为
1!='1'

print(pd.merge(df1, df2, how='outer'))
#   c1  c2 c3  c4  c5  c6  event_count  event_price event_type
# 0  1   2  a  ff   0   1            5          NaN        NaN
# 1  1   2  b  fg   1   3            6          NaN        NaN
# 2  1   2  c  hg   2   4           20          NaN        NaN
# 3  1   2  d  gf   0   1            7          NaN        NaN
# 4  1   2  e  fg   1   4            1          NaN        NaN
# 5  1   2  a  ff   0   1          NaN           20          a
# 6  1   2  b  fg   1   3          NaN           20          a
# 7  1   2  c  hg   2   4          NaN           30          b
# 8  1   2  d  gf   0   1          NaN           40          b
# 9  1   2  e  fg   1   4          NaN           50          b
如果我们将数字字符串转换为数字,则合并 按预期成功:

df1 = df1.convert_objects(numeric=True)
df2 = df2.convert_objects(numeric=True) # not necessary in my example, but may be necessary for you if the numeric strings are in df2.
print(pd.merge(df1, df2, how='outer'))
屈服

   c1  c2 c3  c4  c5  c6  event_count  event_price event_type
0   1   2  a  ff   0   1            5           20          a
1   1   2  b  fg   1   3            6           20          a
2   1   2  c  hg   2   4           20           30          b
3   1   2  d  gf   0   1            7           40          b
4   1   2  e  fg   1   4            1           50          b
虽然
df1=df1.convert\u对象(numeric=True)
可能会解决您的问题,但是 当
df1
和/或
df2
是首先定义的。

使用您的示例数据和代码,您确定没有其他问题吗谢谢!这是有道理的。我还检查了两个数据帧中的所有数据类型,并将其更改为相同的数据类型,以确保情况并非如此,但我使用了astype()not convert_对象。我将尝试使用convert_对象,看看这是否更适合我。但你也是对的,那就是最好从源头上解决问题。这些数据来自dbb查询,如果我只是传递数据帧而没有做任何修改,它们就会正确合并。