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中有更直接的方法来计算这些总和吗?
您可能正在寻找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)