2016-08-30 14 views
0

私は2つのデータフレームdf1とdf2を持っています。python pandas:2つのデータフレームをマージしますが、リピート行はマージしません

DF1は以下の通りです:以下れる:

name exist 
    a  1 
    b  1 
    c  1 
    d  1 
    e  1 

DF2は(名前だけで一つの列を持っている):

 name 
     e  
     f  
     g  
     a  
     h  

私は、これら2つのデータフレームをマージしたい、と繰り返し名をマージしませんでした、つまり、df2の名前がdf1に存在する場合は1回だけ表示し、そうでない場合はdf2がdf1に存在しない場合は存在値を0またはNanに設定します。例えばDF1(及びEがある)、およびDF2(およびeがあり、ちょうど、電子1時間を示した)として、私は次のDFになりたい:

 a  1 
    b  1 
    c  1 
    d  1 
    e  1 
    f  0 
    g  0 
    h  0 

私はconcat関数を使用しましたそれを行うには、私のコードは以下の通りです:

import pandas as pd 


df1 = pd.DataFrame({'name': ['a', 'b', 'c', 'd', 'e'], 
       'exist': ['1', '1', '1', '1', '1']}) 
df2 = pd.DataFrame({'name': ['e', 'f', 'g', 'h', 'a']}) 
df = pd.concat([df1, df2]) 
print(df) 

をしかし、結果が間違っている(名aとeがあったことを繰り返している):

exist name 
0  1 a 
1  1 b 
2  1 c 
3  1 d 
4  1 e 
0 NaN e 
1 NaN f 
2 NaN g 
3 NaN h 
4 NaN a 

事前にあなたの手、感謝を与えてください!

答えて

1

あなたのタイトルによって示されているように、あなたの代わりにconcatmergeを使用することができますし、外部結合を定義するdf1df2からすべてのレコードを維持したいので、outerとしてhowパラメータを指定します。@Psidomため

import pandas as pd 
pd.merge(df1, df2, on = 'name', how = 'outer').fillna(0) 

# exist name 
# 0 1 a 
# 1 1 b 
# 2 1 c 
# 3 1 d 
# 4 1 e 
# 5 0 f 
# 6 0 g 
# 7 0 h 
+0

感謝あなたの答え、私はそれを受け入れます。 「外側」の意味を詳しく教えてください。左、右、内側、バターの違いを意味します。ありがとう! – tktktk0711

+0

これを確認してくださいhttp://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.merge.htmlまたこのhttp://stackoverflow.com/questions/448023/what-is-the-difference左右の外側と内側のジョインの間にあります。おおまかに言えば、結合は、いくつかのキー列に基づいたテーブルの一種の一致です。 leftは最初のデータフレームからすべてのレコードを保持します。 rightは、第2のデータフレームからすべてのレコードを保持する。 innerは両方のデータフレームに存在するレコードのみを保持し、outerはすべてのレコードを保持します。 – Psidom

+0

あなたの種類の答えに感謝! – tktktk0711

関連する問題