在多索引中访问对角线

旅鼠

我有一个带有第3级多索引的pandas DataFrame。我想在前两个索引中提取“对角线”。即提取前两个索引彼此相等的值,而第三个索引采用所有可能的值。

这是一个示例代码,生成了这样一个DataFrame。

import pandas as pd
import numpy as np

df = pd.DataFrame()

d = 0
e = 1
for A in xrange(3):
    for B in xrange(3):
        for C in xrange(2):
            df = df.append(dict(A=A, B=B, C=C, d=d, e=e), ignore_index=True)
            d += 2
            e += 2

df.set_index(['A', 'B', 'C'], inplace=True)
df.sortlevel(inplace=True)
print df

然后,DataFrame如下所示:

        d   e
A B C
0 0 0   0   1
    1   2   3
  1 0   4   5
    1   6   7
  2 0   8   9
    1  10  11
1 0 0  12  13
    1  14  15
  1 0  16  17
    1  18  19
  2 0  20  21
    1  22  23
2 0 0  24  25
    1  26  27
  1 0  28  29
    1  30  31
  2 0  32  33
    1  34  35

我想提取其中AB相等的行(以一种有效的方式,因为实际的DataFrame对于A具有100-1000的值B)。给定上面的示例,我想提取以下DataFrame:

        d   e
A B C
0 0 0   0   1
    1   2   3
1 1 0  16  17
    1  18  19
2 2 0  32  33
    1  34  35

我已经尝试了以下代码。

ind = np.diag_indices(3) + (slice(None),)
df_diag = df.loc[ind, slice(None)]
print df_diag

它打印:

        d   e
A B C
0 0 0   0   1
    1   2   3
  1 0   4   5
    1   6   7
  2 0   8   9
    1  10  11
1 0 0  12  13
    1  14  15
  1 0  16  17
    1  18  19
  2 0  20  21
    1  22  23
2 0 0  24  25
    1  26  27
  1 0  28  29
    1  30  31
  2 0  32  33
    1  34  35

如您所见,它只是选择了所有数据。

我的问题是,如何从DataFrame(例如上面给出的行)中以有效的方式提取where中的行AB具有相同的值。

编辑:答案基准

使用以下代码生成更大的数据框:

numAB = 100
numC = 10
num = numAB**2 * numC
A = np.repeat(np.arange(numAB), numAB * numC)
B = np.tile(np.repeat(np.arange(numAB), numC), numAB)
C = np.tile(np.arange(numC), numAB**2)
d = np.arange(num) * 2
e = d + 1
dflarge = pd.DataFrame(dict(A=A, B=B, C=C, d=d, e=e)).set_index(['A', 'B', 'C'])

我测试了@Alexander的答案:

%%timeit
res = pd.concat([dflarge.loc[pd.IndexSlice[n, n, :], :] for n in dflarge.index.levels[0]])

导致:

10 loops, best of 3: 96.7 ms per loop

我测试了@Fabio的答案:

%%timeit
df2 = dflarge.reset_index()
res = df2[df2['A']==df2['B']]
res.set_index(['A', 'B', 'C'], inplace=True)

导致:

100 loops, best of 3: 8.72 ms per loop

后者快约10倍。

法比奥·拉曼纳(Fabio Lamanna)

我将首先使用以下命令重置数据帧的索引:

df = df.reset_index()

然后执行过滤器以选择所需的内容:

d = df[df['A']==df['B']]

最后再次设置索引:

d.set_index(['A', 'B', 'C'], inplace=True)

这将返回:

        d   e
A B C        
0 0 0   0   1
    1   2   3
1 1 0  16  17
    1  18  19
2 2 0  32  33
    1  34  35

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Python:如何反向访问矩阵中的对角线?

来自分类Dev

CSS中的对角线

来自分类Dev

在HTML中显示对角线分数

来自分类Dev

矩阵中的对角线-Python

来自分类Dev

从列表中找出方阵的对角线

来自分类Dev

熊猫:在DataFrame中获取对角线以下的元素(索引,列)

来自分类Dev

如何获取numpy数组中``对角线''以下元素的索引

来自分类Dev

视线对角线

来自分类Dev

映射对角线

来自分类Dev

如何使对角线和反向对角线与2D矩阵中的点交叉?

来自分类Dev

在MATLAB中创建对角线和左对角线均为1的矩阵

来自分类Dev

如何填充对角线并忽略R中矩阵的对角线?

来自分类Dev

在MATLAB中创建对角线和左对角线均为1的矩阵

来自分类Dev

画布中对角线到角线的渐变

来自分类Dev

在矩阵中按升序排列对角线值,而不是对角线值,这取决于Matlab中的对角线值

来自分类Dev

在矩阵中对角线值按升序排列,而不是对角线值,这取决于Matlab中的对角线值

来自分类Dev

主对角线变成反对角线

来自分类Dev

更改矩阵中心对角线旁边的对角线

来自分类Dev

在Julia中检查对角线主导矩阵

来自分类Dev

R中并行计算上对角线

来自分类Dev

如何在Matlab中沿对角线重复向量

来自分类Dev

您如何测试n个皇后中的对角线?

来自分类Dev

非平方阵列中的对角线

来自分类Dev

仅计算R中矩阵乘法的对角线

来自分类Dev

在Matlab中仅计算矩阵乘积的对角线

来自分类Dev

从R中的对角线逐行减去负矩阵元素

来自分类Dev

Google Visualization API中的奇怪对角线

来自分类Dev

非正方形矩阵中的对角线-Python

来自分类Dev

修改多维numpy数组中的对角线

Related 相关文章

热门标签

归档