熊猫可互换的双索引?

时间:2016-06-21 09:26:30

标签: python pandas dataframe

我有一个DataFrame,我构建了一个双索引。 '启动'价值观并不存在于“终结”中。索引值,反之亦然。

c_weights.rename(columns={0:'start',1:'end',2:'metric',3:'angular',4:'special',5:'cos_pi'}, inplace=True)
c_weights.set_index(['start','end'],inplace=True)
c_weights.head()

df head()

我希望能够拨打以下内容: c_weights.loc [1,638]或c_weights.loc [638,1]并获得相同的数据行。为清楚起见,两个索引组合始终是唯一的。 这怎么可能是骨头?

2 个答案:

答案 0 :(得分:0)

无论如何,对于第一种情况,您可以使用ix进行索引并在行索引上传递元组

c_weights.ix[(1,638)]

对于第二种情况,我想这取决于你是否想知道如果你想要先通过结束,在这种情况下,我只是以正确的方式构建一个元组或反转它( (638,1)[::-1] = (1, 638)

为了达到你的观点:既然你说你有相互独立的开始和结束,你也可以使用以下列表理解

l = (start, end) # l = (end, start) returns the same
c_weights.ix[[x for x in c_weights.index if (x ==  l) or (x == l[::-1])]]

如果您还有唯一索引,则可以将其简化为:

c_weights.ix[[x for x in c_weights.index if (x[0] ==  l[0]) or (x[1] == l[1])]]

答案 1 :(得分:0)

数据框是numpy ndarray的包装器,其中分配了行和列索引。我们可以定义具有不同行或列索引的第二个数据帧,并访问相同的ndarray。例如,让我们首先定义df1,然后使用相同的数据定义df2,但交换MultiIndex行索引中的级别。保持列相同。

import pandas as pd
import numpy as np

np.random.seed([3,1415])

df1 = pd.DataFrame(np.random.rand(4, 2),
                   pd.MultiIndex.from_product([('a', 'b'), (1, 2)]),
                   ['col1', 'col2'])
df2 = pd.DataFrame(df1.values, df1.index.swaplevel(0, 1), df1.columns)

print df1

         col1      col2
a 1  0.444939  0.407554
  2  0.460148  0.465239
b 1  0.462691  0.016545
  2  0.850445  0.817744

print df2

         col1      col2
1 a  0.444939  0.407554
2 a  0.460148  0.465239
1 b  0.462691  0.016545
2 b  0.850445  0.817744

我们可以看到数据是相同的,索引是交换的。从df1访问数据的数据与从df1到共同变异点的数据相同。让我们改变df1中的内容并查看df2

df1.loc[('a', 1), 'col1'] = 1.
print df2

         col1      col2
1 a  1.000000  0.407554
2 a  0.460148  0.465239
1 b  0.462691  0.016545
2 b  0.850445  0.817744

现在我们确信,让我们观察到我们现在有2个数据帧,我们可以从中访问相同的数据。让我们定义一个函数来执行OP要求的功能。

ambigui_t = lambda t: df1.loc[t] if t in df.index else df2.loc[t]

print ambigui_t(('a', 1))

col1    1.000000
col2    0.407554
Name: (a, 1), dtype: float64

print ambigui_t((1, 'a'))

col1    1.000000
col2    0.407554
Name: (1, a), dtype: float64