一個數據幀是圍繞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