我下面有两个数据框:
import pandas as pd
data1 = {'date' : ['1', '2','3'],
'value1' : ['a', 'b' ,'c'],
'value2' : ['12','24','4']}
data2 = {'date' : ['2','3','4'],
'value1' : ['b', 'c' ,'g'],
'value2' : ['24','4','55']}
df1 = pd.DataFrame(data1)
df1 = df1.set_index('date')
df2 = pd.DataFrame(data2)
df2 = df2.set_index('date')
这是我想要的输出:
desired_result = {'date' : ['1','2','3','4'],
'value1' : ['a', 'b', 'c', 'g'],
'value2' : ['12', '24', '4', '55']}
我尝试了所有不同种类的合并,联接,合并,但无法弄清楚。 谢谢。
答案 0 :(得分:2)
这并非完全是合并问题,但您可以使用combine_first
:
df1.combine_first(df2).reset_index()
date value1 value2
0 1 a 12
1 2 b 24
2 3 c 4
3 4 g 55
另一个建议是concat
和drop_duplicates
:
pd.concat([df1, df2]).reset_index('date').drop_duplicates('date')
date value1 value2
0 1 a 12
1 2 b 24
2 3 c 4
5 4 g 55
答案 1 :(得分:2)
感觉像一个groupby
问题
pd.concat([df1,df2]).groupby(level=0).last()
value1 value2
date
1 a 12
2 b 24
3 c 4
4 g 55
答案 2 :(得分:1)
如果使用简单的联接/合并,则将有一些空值。
为此有 pandas.DataFrame.combine_first
或pandas.DataFrame.combine
。
一个简单的方法:df1.combine_first(df2)
应该可以正常工作。
答案 3 :(得分:1)
这绝对是一个完美的merge
问题,只需使用outer
合并并为连接选择正确的keys
就可以了。
删除数据帧的set_index
,您不需要这样做。
data1 = {'date' : ['1', '2','3'],
'value1' : ['a', 'b' ,'c'],
'value2' : ['12','24','4']}
data2 = {'date' : ['2','3','4'],
'value1' : ['b', 'c' ,'g'],
'value2' : ['24','4','55']}
df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
# join with the key columns date, value1 & value2
df4 = pd.merge(df1, df2, on=['date', 'value1', 'value2'], how='outer')
输出
date value1 value2
0 1 a 12
1 2 b 24
2 3 c 4
3 4 g 55