确保您的索引是Dt
df = df.set_index('Dt')
使用numpys 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 解释
这是一个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 操作ds 值
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
你可以看到它只针对下三角
幼稚时间测试