在Numpy/Pandas中生成所有平行对角线总和的直接方法?

8on*_*ne6 10 python numpy pandas

我有一个矩形(不能假设是正方形)的Pandas DataFrame数字.假设我选择了一个对角线方向("左上角到右下角"或"右上角到左下角").我想计算一个系列,其条目是沿着所选并行对角线的原始DataFrame的值的总和.要完全指定目标,您需要确定对角线是"锚定"在左侧还是"锚定"在右侧.对于下面的内容,我假设他们在左边"锚定"了.

我可以毫不费力地做到这一点:

import numpy as np
import pandas as pd

rectdf = pd.DataFrame(np.arange(15).reshape(5,3))

# result:
    0   1   2
0   0   1   2
1   3   4   5
2   6   7   8
3   9  10  11
4  12  13  14
Run Code Online (Sandbox Code Playgroud)

我可以如下计算"左上角到右下角"的对角线总和:

ullrsums = pd.concat([rectdf.iloc[:, i].shift(-i) for i in range(rectdf.shape[1])], axis=1)\
    .sum(axis=1, fillna=0)

# result:
0    12
1    21
2    30
3    22
4    12
Run Code Online (Sandbox Code Playgroud)

我可以通过翻转前面的shift(-i)to 来计算"右上角"对角线总和shift(i):

urllsums = pd.concat([rectdf.iloc[:, i].shift(i) for i in range(rectdf.shape[1])], axis=1)\
    .sum(axis=1, fillna=0)

# result:
0     0
1     4
2    12
3    21
4    30
Run Code Online (Sandbox Code Playgroud)

这些结果都是正确的(即这段代码符合我的要求).在Pandas或Numpy中有更直接的方法来计算这些总和吗?

Ale*_*off 6

您可能正在寻找numpy.trace(),在此记录,直接获取迹线,或numpy.diagonal()获取对角矢量,在此处记录

首先,使用将数据帧转换为numpy矩阵 rectdf.as_matrix()

然后:

np.trace(matrix, offset)
Run Code Online (Sandbox Code Playgroud)

偏移可以是正偏移,也可以是负偏移,可以进行所需的偏移.

例如,如果我们这样做:

a = np.arange(15).reshape(5, 3)
for x in range(-4, 3): print np.trace(a, x)
Run Code Online (Sandbox Code Playgroud)

我们得到输出:

12
22
30
21
12
6
2
Run Code Online (Sandbox Code Playgroud)

要为通用矩阵做到这一点,我们需要从范围-(rows - 1)columns,也就是说,如果我们有一个变量rows和一个变量columns:

a = np.arange(rows * columns).reshape(rows, columns)
for x in range(-(rows - 1), columns): print np.trace(a, x)
Run Code Online (Sandbox Code Playgroud)