Python 无法正确合并多个列上的数据库合并
我遇到了以下问题。我想合并多列上的两个数据帧(确切地说是11列)。令人惊讶的是,通常的方法不起作用。示例数据帧如下所示: df1: df2: 我试过了 结果=pd.merge(df1,df2,how='outer',打开= ['c1','c2','c3','c4','c5','c6'] 这在技术上也应该有效: result=pd.merge(df1,df2,how='outer') 但我明白了: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
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和
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查询,如果我只是传递数据帧而没有做任何修改,它们就会正确合并。