一个数据帧是围绕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个dataframes从中我们可以访问相同的数据。让我们定义一个函数来完成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
也许这是简化您的索引更容易。替代方案可以是:'c_weights.loc [(c_weights.index.get_level_values('start')== 1)&(c_weights.index.get_level_values('end')== 638)]' – kikocorreoso
是不是疯狂的cpu昂贵?它将被用于循环。 – OHTO
是的,它很贵。这就是为什么如果不重复,简化索引可能更好:-) – kikocorreoso