回答編集履歴

1

追記

2019/04/17 09:07

投稿

can110
can110

スコア38266

test CHANGED
@@ -126,4 +126,76 @@
126
126
 
127
127
 
128
128
 
129
+ マルチインデックスにしても速度に変化が見られない場合は、以下のように自力で先頭2列からハッシュ値を算出し、インデックスに指定してみてください。
130
+
131
+ ```Python
132
+
133
+ import pandas as pd
134
+
135
+ import numpy as np
136
+
137
+
138
+
139
+ df1 = pd.DataFrame([[1,1,2],
140
+
141
+ [1,2,3]]) # この行がペアになる
142
+
143
+
144
+
145
+ df2 = pd.DataFrame([[1,2,4,5], # この行がペアになる
146
+
147
+ [2,3,3,3]])
148
+
149
+
150
+
151
+ # 先頭2列(タプルとして)のハッシュ値を得る
152
+
153
+ df1['hash'] = df1.apply(lambda r: hash((r[0],r[1])),axis=1)
154
+
155
+ df2['hash'] = df2.apply(lambda r: hash((r[0],r[1])),axis=1)
156
+
157
+
158
+
159
+ # ハッシュ値をインデックスとする
160
+
161
+ df1 = df1.set_index('hash',drop=True)
162
+
163
+ df2 = df2.set_index('hash',drop=True)
164
+
165
+
166
+
167
+ # インデックスで内部結合
168
+
169
+ # 重複列において右側はそのまま、左(M)側の重複列名には「_dup」を付加する
170
+
171
+ df = pd.merge(df1,df2,left_index=True,right_index=True, how='inner',suffixes=['_dup',''])
172
+
173
+
174
+
175
+ # 左(M)側の重複列は不要なので削除
176
+
177
+ for col in df.columns:
178
+
179
+ if '_dup' in str(col):
180
+
181
+ df = df.drop(str(col), axis=1)
182
+
183
+
184
+
185
+ df = df.reset_index(drop=True) # 通常のインデックスに戻す
186
+
187
+ print(df)
188
+
189
+ """
190
+
191
+ 0 1 2 3
192
+
193
+ 0 1 2 4 5
194
+
195
+ """
196
+
197
+ ```
198
+
199
+
200
+
129
201
  以上、実際に実行時間の計測や計算量の確認は行っておらず多くが推測による回答となりましたが、参考まで。