python – .loc()的轴参数,用于解释轴上传递的切片器= 1

documentation建议:

You can also specify the axis argument to .loc to interpret the passed
slicers on a single axis.

但是,我尝试沿列索引切片时出错.

import pandas as pd
import numpy as np

cols= [(yr,m) for yr in [2014,2015] for m in [7,8,9,10]]
df = pd.DataFrame(np.random.randint(1,100,(10,8)),index=tuple('ABCDEFGHIJ'))
df.columns =pd.MultiIndex.from_tuples(cols)

print df.head()

  2014             2015            
    7   8   9   10   7   8   9   10
A   68  51   6  48   24   3   4  85
B   79  75  68  62   19  40  63  45
C   60  15  32  32   37  95  56  38
D    4  54  81  50   13  64  65  13
E   78  21  84   1   83  18  39  57


#This does not work as expected
print df.loc(axis=1)[(2014,9):(2015,8)]
AssertionError: Start slice bound is non-scalar
#but an arbitrary transpose and changing axis works!
df = df.T
print df.loc(axis=0)[(2014,9):(2015,8)]

          A   B   C   D   E   F   G   H   I   J
2014 9    6  68  32  81  84  60  83  39  94  93
     10  48  62  32  50   1  84  18  14  92  33
2015 7   24  19  37  13  83  69  31  91  69  90
     8    3  40  95  64  18   8  32  93  16  25

所以我总是可以分配切片并重新转置.
虽然感觉像一个黑客,轴= 1设置应该有效.

df = df.loc(axis=0)[(2014,9):(2015,8)]

df = df.T


print df

  2014     2015    
    9   10   7   8 
A   64  98   99  87
B   43  36   22  84
C   32  78   86  66
D   67   8   34  73
E   83  54   96  33
F   18  83   36  71
G   13  25   76   8
H   69   4   99  84
I    3  52   50  62
J   67  60    9  49

最佳答案 那可能是个错误.请在github上发布一个问题.选择事物的标准方法是完全指定所有轴.

In [6]: df.loc[:,(2014,9):(2015,8)]
Out[6]: 
  2014     2015    
    9   10   7   8 
A   26   2   44  69
B   41   7    5   1
C    8  27   23  22
D   54  72   81  93
E   18  23   54   7
F   11  81   37  83
G   60  38   59  29
H    3  95   89  96
I    6   9   77   9
J   90  92   10  32
点赞