数据框-pandas / python中列的所有可能组合

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)

我如何获得一个像这样的新框架:

理想的结果

我遇到了以下帖子,但无法将其转置为专栏文章。

使用熊猫聚合所有数据框行对组合

jez*_*ael 7

您可以使用:

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)


piR*_*red 5

确保您的索引是 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)

我可以di和操纵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)

而且您可以看到它只是针对较低的三角形

天真的时间测试

在此处输入图片说明