2017-05-11 189 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