在Pandas中合并两个数据集

时间:2017-05-11 07:49:02

标签: 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 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。 我看了几个消息来源,也许我弄错了,但是对于我的目的来说,不是“左”命令是正确的做法吗?我也试过“正确”和“外在”。他们没有得到我想要的结果,而“内在”似乎在这里似乎不起作用。

我错过了一些关键的东西吗?

1 个答案:

答案 0 :(得分:6)

Thyere有问题,您的列id在一个df object(显然是string)和另一个int,因此不匹配并获得NaN。< / p>

如果有相同的dtypes

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

merged = pd.merge(df1, df2, how="left", on="id")
print (merged)
   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

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

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

解决方案已由astype(或int中的id列转换为df2str

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