我遇到了以下问题。我想在多个列上合并两个数据帧(确切地说是11个)。令人惊讶的是,通常的方法不起作用。示例数据帧如下: df1:
c1 c2 c3 c4 c5 c6 event_count
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
df2:
c1 c2 c3 c4 c5 c6 event_type event_price
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
我试过
result = pd.merge(df1,df2,how ='outer',on = [ '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
我也试过索引:
df1_index = df1.set_index(['c1','c2','c3'....]); df2_index = df2.set_index(['c1','c2','c3'....]); result = pd.concat([df1_index,df2_index],axis = 1);
但是这给出了同样错误的结果。我确保两张表的dtypes也是一样的。我不知道还有什么可以尝试的。有什么建议? 谢谢:))
答案 0 :(得分: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
答案 1 :(得分:1)
如果一个DataFrame中的值是数字字符串,则您描述的行为可能会发生,而另一个是数字。它们看起来相同,但比较不同。
例如,请考虑下面的df1
和df2
。他们的c
列相同,只是df1['c1']
包含字符串,而df2['c1']
包含整数。
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_objects(numeric=True)
可以解决您的问题,但它
当df1
和/或时,最好回过头来解决问题
首先定义df2
。