2017-05-11 140 views
1

我以前曾使用过Stata,现在正在尝试使用Python完成相同的工作。但是,我对合并命令有麻烦。不知何故,我必须错过一些东西。我的两个dataframes我想合并这个样子的:在Pandas中合并两个数据集

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。 我看了几个资料,也许我错了,但是不是“左”的命令对我的目的是正确的吗?我也尝试过“正确”和“外部”。他们没有得到我想要的结果,而“内在”似乎并没有在这里工作。

我错过了一些至关重要的东西吗?

回答

4

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 

如果只需要添加一个新列的另一种解决方案是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 

和解决方案的转换到intastype(或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