<p>用电视台和数字广播来处理资料的匹配。。。撒上仙尘</p>
<pre><code>ids = ['air_id', 'hpg_id']
cols = ['latitude', 'longitude']
def true(s): return s.astype(bool)
s2 = df2.stack().loc[true].groupby(level=0).apply(set)
s1 = df1[ids].stack().loc[true].groupby(level=0).apply(set)
i, j = np.where((s1.values & s2.values[:, None]).astype(bool))
a = np.zeros((len(df2), 2), int)
a[i, :] = df1[cols].values[j]
df2.join(pd.DataFrame(a, df2.index, cols))
air_id hpg_id latitude longitude
0 hpg1 101 51
1 air2 hpg2 102 52
2 hpg3 103 53
</code></pre>
<hr/>
<p><strong>详细信息</strong></p>
<p><code>s2</code>看起来像这样</p>
^{pr2}$
<p>和<code>s1</code></p>
<pre><code>0 {air1, hpg1}
1 {hpg2}
2 {hpg3}
3 {air4, hpg4}
4 {air2}
dtype: object
</code></pre>
<p>关键是我们想找出该行中的任何内容是否与另一个数据帧中的行中的任何其他内容匹配。现在我可以使用广播和<code>&</code></p>
<pre><code>s1.values & s2.values[:, None]
array([[{'hpg1'}, set(), set(), set(), set()],
[set(), {'hpg2'}, set(), set(), {'air2'}],
[set(), set(), {'hpg3'}, set(), set()]], dtype=object)
</code></pre>
<p>但是在布尔上下文中,空集的值为<code>False</code>,因此</p>
<pre><code>(s1.values & s2.values[:, None]).astype(bool)
array([[ True, False, False, False, False],
[False, True, False, False, True],
[False, False, True, False, False]], dtype=bool)
</code></pre>
<p>现在我可以使用<code>np.where</code>来显示这些<code>True</code>在哪里</p>
<pre><code>i, j = np.where((s1.values & s2.values[:, None]).astype(bool))
print(i, j)
[0 1 1 2] [0 1 4 2]
</code></pre>
<p>它们分别是<code>df2</code>和{<cd8>}中的行。但是我不需要两行<code>1</code>,所以我创建了一个大小合适的空数组,期望覆盖<code>1</code>行。我用<code>df1</code>中的lat和lon填充这些值</p>
<pre><code>a = np.zeros((len(df2), 2), int)
a[i, :] = df1[cols].values[j]
a
array([[101, 51],
[102, 52],
[103, 53]])
</code></pre>
<p>然后我用<code>pd.DataFrame</code>将其包装起来,并按上面所示进行连接。在</p>