擅长:python、mysql、java
<p>使用广播减法,然后<code>np.tril_indices</code>提取下对角线(正值)。你知道吗</p>
<pre><code># <= 0.23
# u = df['A'].values
# 0.24+
u = df['A'].to_numpy()
u2 = (u[:,None] - u)
pd.Series(u2[np.tril_indices_from(u2, k=-1)])
0 10
1 200
2 190
3 3000
4 2990
5 2800
dtype: int64
</code></pre>
<p>或者,使用<code>subtract.outer</code>避免预先转换为数组。你知道吗</p>
<pre><code>u2 = np.subtract.outer(*[df.A]*2)
pd.Series(u2[np.tril_indices_from(u2, k=-1)])
</code></pre>
<p>如果您也需要索引,请使用</p>
<pre><code>idx = np.tril_indices_from(u2, k=-1)
pd.DataFrame({
'val':u2[np.tril_indices_from(u2, k=-1)],
'row': idx[0],
'col': idx[1]
})
val row col
0 10 1 0
1 200 2 0
2 190 2 1
3 3000 3 0
4 2990 3 1
5 2800 3 2
</code></pre>