将有重叠索引的两个数据框合并,保留左侧数据框的列值。

3

如何合并两个Pandas DataFrames,这两个DataFrame有部分重复的索引,我希望得到的合并DataFrame保留第一个DataFrame中的列值,即删除df2中的重复行?

import pandas as pd
import io  
    
df1 = """
date; count
'2020-01-01'; 210
'2020-01-02'; 189
'2020-01-03'; 612
'2020-01-04'; 492
'2020-01-05'; 185
'2020-01-06'; 492
'2020-01-07'; 155
'2020-01-08'; 62
'2020-01-09'; 15
"""
df2 = """
date; count
'2020-01-04'; 21
'2020-01-05'; 516
'2020-01-06'; 121
'2020-01-07'; 116
'2020-01-08'; 82
'2020-01-09'; 121
'2020-01-10'; 116
'2020-01-11'; 82
'2020-01-12'; 116
'2020-01-13'; 82
"""


df1 = pd.read_csv(io.StringIO(df1), sep=";")
df2 = pd.read_csv(io.StringIO(df2), sep=";")
print(df1)
print(df2)

我尝试过使用

df1.reset_index().merge(df2, how='outer').set_index('date')

然而,这会丢失df2中的重复值。是否有一种方法可以保留第一个数据框中的重复行?

期望结果:

print(df3)
 date        count
'2020-01-01' 210
'2020-01-02' 189
'2020-01-03' 612
'2020-01-04' 492
'2020-01-05' 185
'2020-01-06' 492
'2020-01-07' 155
'2020-01-08' 62
'2020-01-09' 15
'2020-01-10' 116
'2020-01-11' 82
'2020-01-12' 116
'2020-01-13' 82

非常感谢您的帮助,谢谢。
3个回答

2
使用combine_first方法:
df3 = (df1.set_index('date')
          .combine_first(df2.set_index('date'))
          .reset_index()
      )  

输出:

            date   count
0   '2020-01-01'     210
1   '2020-01-02'     189
2   '2020-01-03'     612
3   '2020-01-04'     492
4   '2020-01-05'     185
5   '2020-01-06'     492
6   '2020-01-07'     155
7   '2020-01-08'      62
8   '2020-01-09'      15
9   '2020-01-10'     116
10  '2020-01-11'      82
11  '2020-01-12'     116
12  '2020-01-13'      82

谢谢您,非常有帮助。不幸的是,我的数据框混淆了 - 我想保留第二个数据框的行(有效地预先添加),所以我会在另一个问题中询问。 - cmp
@cmp 你的意思是想要优先考虑第二个数据框的值吗?那么只需要交换 df1df2 的位置即可。 - mozway
是的,没错。我已经尝试过这个方案,但结果仍然似乎保留了与df1重叠部分的值?谢谢您的帮助。 - cmp
我尝试过,并且在提供的示例中运行良好。请仔细再次检查一下 ;) - mozway

0
这里有另一种方法,使用concatdrop_duplicates
df3=pd.concat([df1, df2]).drop_duplicates(["date"], keep="first", ignore_index=True)

输出:

            date   count
0   '2020-01-01'     210
1   '2020-01-02'     189
2   '2020-01-03'     612
3   '2020-01-04'     492
4   '2020-01-05'     185
5   '2020-01-06'     492
6   '2020-01-07'     155
7   '2020-01-08'      62
8   '2020-01-09'      15
9   '2020-01-10'     116
10  '2020-01-11'      82
11  '2020-01-12'     116
12  '2020-01-13'      82

0
df1.merge(df2,on='date',how="outer",suffixes=[None,'_2']).bfill(axis=1).drop(" count_2",axis=1)

输出:

            date   count
0   '2020-01-01'     210
1   '2020-01-02'     189
2   '2020-01-03'     612
3   '2020-01-04'     492
4   '2020-01-05'     185
5   '2020-01-06'     492
6   '2020-01-07'     155
7   '2020-01-08'      62
8   '2020-01-09'      15
9   '2020-01-10'     116
10  '2020-01-11'      82
11  '2020-01-12'     116
12  '2020-01-13'      82

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接