请确保您的索引是 Dt
。
df = df.set_index('Dt')
使用
numpy
的
np.tril_indices
和切片操作。
有关
np.triu_indices
的说明,请参见下面。
v = df.values
i, j = np.tril_indices(len(df.columns), -1)
我们可以为列创建一个 `pd.MultiIndex`。这样更适用于列名超过一个字符的情况。
pd.DataFrame(
v[:, i] - v[:, j],
df.index,
[df.columns[j], df.columns[i]]
)
A B A B C
B C C D D D
Dt
11-apr 0 0 0 0 0 0
10-apr 1 -1 -2 0 -1 1
但我们也可以这样做。
pd.DataFrame(
v[:, i] - v[:, j],
df.index,
df.columns[j] + df.columns[i]
)
AB AC BC AD BD CD
Dt
11-apr 0 0 0 0 0 0
10-apr 1 -1 -2 0 -1 1
np.tril_indices 解释
np.tril_indices
是一个 numpy
函数,它返回两个数组,这两个数组结合使用可以提供一个方阵的下三角位置。当对一些东西的所有组合进行操作时,这非常方便,因为该下三角代表矩阵的一个轴与另一个轴的所有组合。
考虑数据帧 d
作为示例
d = pd.DataFrame(np.array(list('abcdefghijklmnopqrstuvwxy')).reshape(-1, 5))
d
0 1 2 3 4
0 a b c d e
1 f g h i j
2 k l m n o
3 p q r s t
4 u v w x y
三角形的索引,当看作坐标对时,如下所示。
i, j = np.tril_indices(5, -1)
list(zip(i, j))
[(1, 0),
(2, 0),
(2, 1),
(3, 0),
(3, 1),
(3, 2),
(4, 0),
(4, 1),
(4, 2),
(4, 3)]
我可以通过使用
i和
j来操纵
d
的值。
d.values[i, j] = 'z'
d
0 1 2 3 4
0 a b c d e
1 z g h i j
2 z z m n o
3 z z z s t
4 z z z z y
你可以看到它只针对那个下三角形进行了定位。
朴素时间测试
![在这里输入图片描述](https://istack.dev59.com/q1cjA.webp)