2016-11-17 6 views
4

これは非常に簡単ですが、なぜ2つのデータフレームをマージできないのですか? Iによりdf1df2をマージしたい異なる形状の2つのパンダデータフレームをマージする際の問題?

DF1

A      id 
0 microsoft inc   1 
1 apple computer.  2 
2 Google Inc.   3 
3 IBM     4 
4 amazon, Inc.   5 

DF2

B C D E id 
0 (01780-500-01) 237489 - 342 API  True. 1 
0 (409-6043-01) 234324 API  Other 2 
0 23423423 API  NaN  NaN  3 
0 (001722-5e240-60) NaN  NaN  Other 4 
1 (0012172-52411-60) 32423423. NaN  Other 4 
0 29849032-29482390 API  Yes  False 5 
1 329482030-23490-1 API  Yes  False 5 

:私は、異なる形状(一方が他方よりも大きいと広い)と、以下のdf Sを有していますindexカラム:

df3

A B C D E id 
0 microsoft inc (01780-500-01) 237489 - 342 API  True. 1 
1 apple computer. (409-6043-01) 234324 API  Other 2 
2 Google Inc. 23423423 API  NaN  NaN  3 
3 IBM (001722-5e240-60) NaN  NaN  Other 4 
4 IBM (0012172-52411-60) 32423423. NaN  Other 4 
5 amazon, Inc. 29849032-29482390 API  Yes  False 5 
6 amazon, Inc. 329482030-23490-1 API  Yes  False 5 

私はこれがmerge()を使用して実行できることを知っています。私が試した後

IndexError: indices are out-of-bounds 

で:

pd.merge(df1, df2, on=df1.id, how='outer') 

アウトすることも、私はこの素晴らしいtutorialを読んでみました

pd.merge(df2, df1, on='id', how='outer') 

、明らかにその数回の繰り返し結合された行は次のようになります。

A B C D E index 
0 microsoft inc (01780-500-01) 237489 - 342 API  True. 1 
1 apple computer. (409-6043-01) 234324 API  Other 2 
2 apple computer. (409-6043-01) 234324 API  Other 2 
3 apple computer. (409-6043-01) 234324 API  Other 2 
4 apple computer. (409-6043-01) 234324 API  Other 2 
5 apple computer. (409-6043-01) 234324 API  Other 2 
6 apple computer. (409-6043-01) 234324 API  Other 2 
7 apple computer. (409-6043-01) 234324 API  Other 2 
8 apple computer. (409-6043-01) 234324 API  Other 2 
... 

これは、インデックスが奇妙に見えてから削除されたため、一時インデックスdf2['position'] = df2.indexを作成したことと関連していると思います。だから、私の質問はdf3を得る方法ですか?

UPDATE

私はこのようなdf2の指標固定:

df2.reset_index(drop=True, inplace=True) 

をそして今、次のようになります。

B C D E id 
0 (01780-500-01) 237489 - 342 API  True. 1 
1 (409-6043-01) 234324 API  Other 2 
2 23423423 API  NaN  NaN  3 
3 (001722-5e240-60) NaN  NaN  Other 4 
4 (0012172-52411-60) 32423423. NaN  Other 4 
5 29849032-29482390 API  Yes  False 5 
6 329482030-23490-1 API  Yes  False 5 

私はまだ同じ問題を抱えています。マージされた行は数回繰り返されます。

>>>print(df2.dtypes) 
B object 
C object 
D object 
E object 
id int64 
dtype: object 

>>>print(df1.dtypes) 
A    object 
id    int64 
dtype: object 

アップデート2

>>>print(df2['id']) 
0  1 
1  2 
2  3 
3  4 
4  4 
5  5 
6  5 
7  6 
8  6 
9  7 
10  8 
11  8 
12  8 
13  8 
14  9 
15  10 
16  11 
17  11 
18  12 
19  12 
20  13 
21  13 
22  14 
23  15 
24  16 
25  16 
26  17 
27  17 
28  18 
29  18 
     ... 
476 132 
477 132 
478 132 
479 132 
480 132 
481 132 
482 132 
483 132 
484 133 
485 133 
486 133 
487 133 
488 134 
489 134 
490 134 
491 134 
492 135 
493 135 
494 136 
495 136 
496 137 
497 137 
498 137 
499 137 
500 137 
501 137 
502 137 
503 138 
504 138 
505 138 
Name: id, dtype: int64 

そして

>>>print(df1) 

0  1 
1  2 
2  3 
3  4 
4  5 
5  6 
6  7 
7  8 
8  9 
9  10 
10  11 
11  8 
12  12 
13  6 
14  7 
15  8 
16  6 
17  11 
18  13 
19  14 
20  15 
21  11 
22  2 
23  16 
24  17 
25  18 
26  9 
27  19 
28  11 
29  20 
     .. 
108 57 
109 43 
110 22 
111  2 
112 58 
113 49 
114 22 
115 59 
116  2 
117  6 
118 22 
119  2 
120 37 
121  2 
122  9 
123 60 
124 61 
125 62 
126 63 
127 42 
128 64 
129  4 
130 29 
131 11 
132  2 
133 25 
134  4 
135 65 
136 66 
137  4 
Name: id, dtype: int64 
+0

@ JohnEで述べたように、両方のデータフレームのid列を再確認することもできます。同じ動作を試しました。質問を明確にする方法はありますか? –

+0

私はちょうどそれを試み、それは私のために正常に動作します。 df2のデータが正しく読み込まれていないと思われます(列がどのように並んでいるかを参照してください)。 'df ['id']'と入力すると、あなたが思っていると思われるものが含まれていることを再度確認してください。 – JohnE

+0

共通のインデックス軸でマージしようとしている場合は、代わりに['join'](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.join.html)を使用することをお勧めします。あなたが正しい結果を得たかどうか試してみてください。ただし、両方のインデックス軸が適切に設定されていることを確認してください。 –

答えて

1

あなたはidとしてインデックスを設定して、joinを使用して試みることができる:

df1 = pd.DataFrame([('microsoft inc',1), 
('apple computer.',2), 
('Google Inc.',3), 
('IBM',4), 
('amazon, Inc.',5)],columns = ('A','id')) 

df2 = pd.DataFrame([('(01780-500-01)','237489', '- 342','API', 1), 
('(409-6043-01)','234324', ' API','Other ',2), 
('23423423','API', 'NaN','NaN',  3), 
('(001722-5e240-60)','NaN', 'NaN','Other', 4), 
('(0012172-52411-60)','32423423',' NaN','Other', 4), 
('29849032-29482390','API', ' Yes','  False', 5), 
('329482030-23490-1','API', ' Yes','  False', 5)], 
columns = ['B','C','D','E','id']) 

df1 =df1.set_index('id') 
df1.drop_duplicates(inplace=True) 
df2 = df2.set_index('id') 
df3 = df1.join(df2,how='outer') 

両方のデータフレームのインデックス列(別名結合キー)を設定したので、on='id'パラメータを指定する必要はありません。

これは別の方法で問題を解決しています。pd.merge(df1, df2, on='id', how='outer')に間違いはありません。 @JohnE

+1

ええ、両方のデータセットで 'id'の範囲が1から5(両端を含む)であるため、実際には内側と外側は無関係です。 – JohnE

+1

'df1.dtypes'と' df2.dtypes'の出力は何ですか? –

+0

私は@ ShivamGaurを更新しました –

関連する問題