如何使用merge函数合并两个数据帧中的公共值?

如何使用merge函数合并两个数据帧中的公共值?,merge,pandas,dataframe,Merge,Pandas,Dataframe,我有两个数据帧,我想在列“Id”上合并 df1: Id Reputation 1 10 3 5 4 40 df2: Id Reputation 1 10 2 5 3 5 6 55 我希望输出为: 数据输出: Id Reputation 1 10 2 5 3 5 4 40 6 55 我希望保留两个df的所有值,但将重复值合并为一个。我知道我必须使用m

我有两个数据帧,我想在列“Id”上合并

df1:

Id   Reputation
 1     10
 3     5
 4     40
df2:

Id   Reputation
 1     10
 2     5
 3     5
 6     55
我希望输出为:

数据输出:

Id    Reputation
1       10
2       5
3       5
4       40
6       55
我希望保留两个df的所有值,但将重复值合并为一个。我知道我必须使用merge()函数,但我不知道要传递哪些参数。

您可以,
Id
,然后通过获取每组中的第一项进行聚合

In [62]: pd.concat([df1,df2]).groupby('Id').first()
Out[62]: 
    Reputation
Id            
1           10
2            5
3            5
4           40
6           55

[5 rows x 1 columns]
或者,要将
Id
保留为列而不是索引,请使用
as_index=False

In [68]: pd.concat([df1,df2]).groupby('Id', as_index=False).first()
Out[68]: 
   Id  Reputation
0   1          10
1   2           5
2   3           5
3   4          40
4   6          55

[5 rows x 2 columns]

卡尔德。提出了一个好主意;使用:

对于大型数据帧,此解决方案似乎更快:

import pandas as pd
import numpy as np

N = 10**6
df1 = pd.DataFrame({'Id':np.arange(N), 'Reputation': np.random.randint(5, size=N)})
df2 = pd.DataFrame({'Id':np.arange(10, 10+N), 'Reputation':np.random.randint(5, size=N)})

您可以,
Id
,然后通过获取每组中的第一项进行聚合

In [62]: pd.concat([df1,df2]).groupby('Id').first()
Out[62]: 
    Reputation
Id            
1           10
2            5
3            5
4           40
6           55

[5 rows x 1 columns]
或者,要将
Id
保留为列而不是索引,请使用
as_index=False

In [68]: pd.concat([df1,df2]).groupby('Id', as_index=False).first()
Out[68]: 
   Id  Reputation
0   1          10
1   2           5
2   3           5
3   4          40
4   6          55

[5 rows x 2 columns]

卡尔德。提出了一个好主意;使用:

对于大型数据帧,此解决方案似乎更快:

import pandas as pd
import numpy as np

N = 10**6
df1 = pd.DataFrame({'Id':np.arange(N), 'Reputation': np.random.randint(5, size=N)})
df2 = pd.DataFrame({'Id':np.arange(10, 10+N), 'Reputation':np.random.randint(5, size=N)})


这是可行的,但如何使输出为[5行X 2列]?我想保留Id列。当我执行此操作时,它消失了也许,我误解了问题,但您不能先使用
combine\u
(如果您将
Id
设置为索引)来执行此操作吗。所以:
df1.combined_first(df2)
@KarlD.:我原以为使用
set_index
reset_index
会让速度变得相当慢,但事实上,对于大数据帧,您的想法似乎更快。您想把它作为一个解决方案吗?谢谢unutbu,我认为不需要单独的解决方案。因此,如果您认为combine first是一个有用的替代方案,请随意添加它。这很有效,但是如何使输出为[5行X 2列]?我想保留Id列。当我执行此操作时,它消失了也许,我误解了问题,但您不能先使用
combine\u
(如果您将
Id
设置为索引)来执行此操作吗。所以:
df1.combined_first(df2)
@KarlD.:我原以为使用
set_index
reset_index
会让速度变得相当慢,但事实上,对于大数据帧,您的想法似乎更快。您想把它作为一个解决方案吗?谢谢unutbu,我认为不需要单独的解决方案。因此,如果您认为combine first是一个有用的选择,请随意添加它