如何使用merge函数合并两个数据帧中的公共值?
我有两个数据帧,我想在列“Id”上合并 df1:如何使用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 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是一个有用的选择,请随意添加它