fre*_*888 2 python merge pandas
我之前曾与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
Run Code Online (Sandbox Code Playgroud)
我现在的目标是获得以下数据集:
Date id Market_Cap Ticker
2000 1 400 Shell
2000 2 200 ExxonMobil
2001 1 410 Shell
2001 2 220 ExxonMobil
Run Code Online (Sandbox Code Playgroud)
我尝试了以下命令:
merged= pd.merge(df1, df2, how="left", on="id")
Run Code Online (Sandbox Code Playgroud)
这会合并数据集,但在Ticker列中只给出了nan.我看了几个消息来源,也许我弄错了,但是对于我的目的来说,不是"左"命令是正确的做法吗?我也试过"正确"和"外在".他们没有得到我想要的结果,而"内在"似乎在这里似乎不起作用.
我错过了一些关键的东西吗
Thyere是一个问题,你的列id在一个df object(显然string)和另一个int,所以没有匹配得到NaN.
如果有相同的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
Run Code Online (Sandbox Code Playgroud)
如果需要添加一个新列,另一个解决方案是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
Run Code Online (Sandbox Code Playgroud)
模拟你的问题:
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
Run Code Online (Sandbox Code Playgroud)
而解决办法是转换成int通过astype(或列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
Run Code Online (Sandbox Code Playgroud)