Pandas中的逻辑多索引

时间:2016-06-28 10:22:42

标签: python pandas indexing dataframe multi-index

有没有办法为B大于零的索引One提取C的所有值?所以我想提取值-0.22-1.21

import numpy as np
import pandas as pd
arrays =[np.array(['One','One','One','Two','Two','Two']),np.array(['A','B','C','A','B','C'])]
df = pd.DataFrame(np.random.randn(6,5),index=arrays)

df
               0         1         2         3         4
One     A -0.908680  0.031505 -0.087090 -0.039527  0.221196
        B  1.010757  1.272553 -0.220535 -1.216996 -0.122108
        C -0.781714 -1.830215  0.584311  0.010987 -0.050355
Two     A -0.331269  0.410596  0.569802  1.455710  0.377796
        B  0.079330 -2.538031 -1.665904  0.477257  0.500805
        C -0.388749  2.188289 -1.465292  0.594870 -0.031983

1 个答案:

答案 0 :(得分:2)

您可以创建mask,然后mask使用loc

import numpy as np
import pandas as pd
np.random.seed(1)
arrays = [np.array(['One','One','One','Two','Two','Two']),
          np.array(['A','B','C','A','B','C'])]
df = pd.DataFrame(np.random.randn(6,5),index=arrays)
print (df)
              0         1         2         3         4
One A  1.624345 -0.611756 -0.528172 -1.072969  0.865408
    B -2.301539  1.744812 -0.761207  0.319039 -0.249370
    C  1.462108 -2.060141 -0.322417 -0.384054  1.133769
Two A -1.099891 -0.172428 -0.877858  0.042214  0.582815
    B -1.100619  1.144724  0.901591  0.502494  0.900856
    C -0.683728 -0.122890 -0.935769 -0.267888  0.530355

idx = pd.IndexSlice
mask = (df.loc[idx['One', 'C'],:]) > 0

print (mask)
0     True
1    False
2    False
3    False
4     True
Name: (One, C), dtype: bool

print (df.loc[idx['One', 'B'], mask])
0   -2.301539
4   -0.249370
Name: (One, B), dtype: float64