[英]pandas interchangeable dual indexing?
我有一个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()
我希望能够调用类似的内容:c_weights.loc [1,638]或c_weights.loc [638,1]并获取同一行数据。 为了清楚起见,这两个索引组合始终是唯一的。 这怎么可能是骨头?
无论如何,对于第一种情况,您可以使用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])]]
数据帧是围绕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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.