如何仅引用MultiIndex的某些部分?

时间:2019-05-15 17:35:07

标签: python python-3.x pandas

这个问题有两个阶段。

我有一个MultiIndex,例如:

import pandas as pd

d = {'category': ['a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'c', 'c', 'c', 'c'],
     'colour': ['red', 'blue', 'green', 'orange', 'red', 'blue', 'green', 'orange', 'red', 'blue', 'green', 'orange'],
     'amount': [28.1, 5.6, 43.6, 13.3, 4.1, 27.6, 19.7, 37.5, 26.7, 73.7, 94.4, 77.5],
     'scalar': [3.4, 2.8, 3.4, 1.7, 2.2, 0.8, 1.9, 0.3, 2.4, 0.2, 0.5, 1.5]}
df = pd.DataFrame(d)
df.set_index(['category', 'colour'], inplace=True)

结果是:

                 amount  scalar
category colour                
a        red       28.1     3.4
         blue       5.6     2.8
         green     43.6     3.4
         orange    13.3     1.7
b        red        4.1     2.2
         blue      27.6     0.8
         green     19.7     1.9
         orange    37.5     0.3
c        red       26.7     2.4
         blue      73.7     0.2
         green     94.4     0.5
         orange    77.5     1.5

第1阶段

我想选择colourgreen的所有行,而不考虑category。我敢肯定它非常简单,但无法解决。

结果应如下所示:

                 amount  scalar
category colour                
a        green     43.6     3.4
b        green     19.7     1.9
c        green     94.4     0.5

第二阶段 将所有amount行的所有green值乘以10。

结果将是:

                 amount  scalar
category colour                
a        red       28.1     3.4
         blue       5.6     2.8
         green    436.0     3.4
         orange    13.3     1.7
b        red        4.1     2.2
         blue      27.6     0.8
         green    197.0     1.9
         orange    37.5     0.3
c        red       26.7     2.4
         blue      73.7     0.2
         green    944.0     0.5
         orange    77.5     1.5

谢谢

4 个答案:

答案 0 :(得分:3)

df.xs('green', level='colour', drop_level=False)
                 amount  scalar
category colour
a        green     43.6     3.4
b        green     19.7     1.9
c        green     94.4     0.5

答案 1 :(得分:2)

在此处使用query


df.query('colour == "green"')

                 amount  scalar
category colour
a        green     43.6     3.4
b        green     19.7     1.9
c        green     94.4     0.5

答案 2 :(得分:2)

我将使用IndexSlice

df.loc[pd.IndexSlice[:,'green'],:]
Out[86]: 
                 amount  scalar
category colour                
a        green     43.6     3.4
b        green     19.7     1.9
c        green     94.4     0.5

答案 3 :(得分:1)

尝试:

df[df.index.get_level_values(level=1) =='green']

输出:

                    amount  scalar
category    colour      
a           green   43.6    3.4
b           green   19.7    1.9
c           green   94.4    0.5