S.P*_*ers 4 combinations pandas
我正在尝试采用一个数据框并创建另一个数据框,其中包含列的所有可能组合以及相应值之间的差,即在11-apr列上,AB应该为(BA)= 0等。
例如,从
Dt A B C D
11-apr 1 1 1 1
10-apr 2 3 1 2
Run Code Online (Sandbox Code Playgroud)
我如何获得一个像这样的新框架:
我遇到了以下帖子,但无法将其转置为专栏文章。
您可以使用:
from itertools import combinations
df = df.set_index('Dt')
cc = list(combinations(df.columns,2))
df = pd.concat([df[c[1]].sub(df[c[0]]) for c in cc], axis=1, keys=cc)
df.columns = df.columns.map(''.join)
print (df)
AB AC AD BC BD CD
Dt
11-apr 0 0 0 0 0 0
10-apr 1 -1 0 -2 -1 1
Run Code Online (Sandbox Code Playgroud)
确保您的索引是 Dt
df = df.set_index('Dt')
Run Code Online (Sandbox Code Playgroud)
使用numpys np.tril_indices和切片参见下面的解释np.triu_indices
v = df.values
i, j = np.tril_indices(len(df.columns), -1)
Run Code Online (Sandbox Code Playgroud)
我们可以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
Run Code Online (Sandbox Code Playgroud)
但是我们也可以
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
三角形索引在看似坐标对时看起来像这样
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)]
Run Code Online (Sandbox Code Playgroud)
我可以d用i和操纵s的值j
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
Run Code Online (Sandbox Code Playgroud)
而且您可以看到它只是针对较低的三角形
天真的时间测试
| 归档时间: |
|
| 查看次数: |
9644 次 |
| 最近记录: |