Python 合并熊猫中的两个数据集

Python 合并熊猫中的两个数据集,python,pandas,merge,Python,Pandas,Merge,我以前与Stata合作过,现在正试图用Python完成同样的工作。但是,我对merge命令有问题。不知怎的,我一定错过了什么。我要合并的两个数据帧如下所示: df1: Date id Market_Cap 2000 1 400 2000 2 200 2001 1 410 2001 2 220 df2: id Ticker 1 Shell 2 ExxonMobil 我现在的目标是获得以下数据集: Date id Market_Cap Ticker 2000

我以前与Stata合作过,现在正试图用Python完成同样的工作。但是,我对merge命令有问题。不知怎的,我一定错过了什么。我要合并的两个数据帧如下所示:

 df1:
 Date id Market_Cap
 2000 1  400
 2000 2  200
 2001 1  410
 2001 2  220

 df2:
 id Ticker
 1   Shell
 2   ExxonMobil
我现在的目标是获得以下数据集:

Date id Market_Cap  Ticker
2000 1  400        Shell 
2000 2  200        ExxonMobil 
2001 1  410        Shell 
2001 2  220        ExxonMobil
我尝试了以下命令:

merged= pd.merge(df1, df2, how="left", on="id")
这合并了数据集,但在Ticker列中只给出了nan。 我查看了几个来源,可能是我弄错了,但是“left”命令不是为了我的目的而做的正确的事情吗?我也试过“正确”和“外在”。他们没有得到我想要的结果,“内在”似乎在这里一般不起作用


我遗漏了一些重要的东西吗?

问题出在一个df中你的列
id
对象(显然
字符串
)和另一个
int
,因此没有匹配项和get
NaN

如果有相同的:

如果只需要添加一个新列,另一个解决方案是:

模拟您的问题:

print (df1['id'].dtypes)
object
print (df2['id'].dtypes)
int64

df1['Ticker'] = df1['id'].map(df2.set_index('id')['Ticker'])
print (df1)
   Date id  Market_Cap Ticker
0  2000  1         400    NaN
1  2000  2         200    NaN
2  2001  1         410    NaN
3  2001  2         220    NaN
解决方案通过以下方式转换为
int
df2
中的
id
列转换为
str
):

df1['Ticker'] = df1['id'].map(df2.set_index('id')['Ticker'])
print (df1)
   Date  id  Market_Cap      Ticker
0  2000   1         400       Shell
1  2000   2         200  ExxonMobil
2  2001   1         410       Shell
3  2001   2         220  ExxonMobil
print (df1['id'].dtypes)
object
print (df2['id'].dtypes)
int64

df1['Ticker'] = df1['id'].map(df2.set_index('id')['Ticker'])
print (df1)
   Date id  Market_Cap Ticker
0  2000  1         400    NaN
1  2000  2         200    NaN
2  2001  1         410    NaN
3  2001  2         220    NaN
df1['id'] = df1['id'].astype(int)
#alternatively
#df2['id'] = df2['id'].astype(str)
df1['Ticker'] = df1['id'].map(df2.set_index('id')['Ticker'])
print (df1)
   Date  id  Market_Cap      Ticker
0  2000   1         400       Shell
1  2000   2         200  ExxonMobil
2  2001   1         410       Shell
3  2001   2         220  ExxonMobil