2017-05-11 17 views
1

以前はStataを使っていましたが、今はPythonで同じことをしようとしています。しかし、私はマージコマンドに問題があります。どういうわけか私は何かを欠いているに違いない。私はこのようになりマージする私の2つのデータフレーム:パンダの2つのデータセットを結合する

merged= pd.merge(df1, df2, how="left", on="id") 

このマージ:私は、次のコマンドを試してみました

Date id Market_Cap Ticker 
2000 1 400  Shell 
2000 2 200  ExxonMobil 
2001 1 410  Shell 
2001 2 220  ExxonMobil 

df1: 
Date id Market_Cap 
2000 1 400 
2000 2 200 
2001 1 410 
2001 2 220 

df2: 
id Ticker 
1 Shell 
2 ExxonMobil 

が今目指してマイを、次のデータセットを得ることですデータセットは、ティッカー列に私には唯一のナノを与えます。 私はいくつかの情報源を見て、間違っているかもしれませんが、私の目的のために正しいことをする「左」のコマンドではありませんか?私はまた、 "右"と "外側"を試しました。彼らは私がしたい結果を得ていないし、 "内部"は一般的にここで動作していないようです。

私は何かが欠けていますか?

答えて

4

Thyereは1人のDFであなたのコラムidobject(明らか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 

、溶液を変換していますintによるastype(またはdf2stridの列):

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 
関連する問題