我之前曾与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。 我看了几个消息来源,也许我弄错了,但是对于我的目的来说,不是“左”命令是正确的做法吗?我也试过“正确”和“外在”。他们没有得到我想要的结果,而“内在”似乎在这里似乎不起作用。
我错过了一些关键的东西吗?
答案 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
列转换为df2
到str
:
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