在Pandas中合并两个数据集

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

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

jez*_*ael 6

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(或列iddf2str):

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)