以zip值作为索引切片Multiindex Data Frame

时间:2019-02-18 22:10:20

标签: python pandas multi-index

我有一个这样的Multiindex数据框:

import pandas as pd
import numpy as np

lat = [10.1,16.5,35.8,40.6,80.7,60.1]
long = [11.3,19.4,33.6,43.8,65.2,60.1]

years = list(range(2000,2010,1))
months = list(range(1,13,1))
variables = ['S','L','A','W']

miindex = pd.MultiIndex.from_product([zip(lat,long),years, months])
micolumns = pd.MultiIndex.from_tuples(variables)
dfmi = pd.DataFrame(np.arange(len(miindex) * len(micolumns)).reshape((len(miindex),\
                              len(micolumns))),index=miindex,    \
                              columns=micolumns).                \
                              sort_index().sort_index(axis=0)

#In [10]: dfmi
#Out[10]:
#                         S     L     A     W
#(10.1, 11.3) 2000 1      0     1     2     3
#                  2      4     5     6     7
#                  3      8     9    10    11
#                  4     12    13    14    15
#                  5     16    17    18    19
#                  6     20    21    22    23
#                  7     24    25    26    27
#                  8     28    29    30    31
#                  9     32    33    34    35
#                  10    36    37    38    39
#                  11    40    41    42    43
#                  12    44    45    46    47
#             2001 1     48    49    50    51
#                  2     52    53    54    55
#                  3     56    57    58    59

我能够根据这样的年份或月份对数据集进行切片

summer_data = dfmi.loc[(slice(None),slice(None),slice(6,8)),:]
#In[11]: summer_data
#Out[11]:
#                        S     L     A     W
#(10.1, 11.3) 2000 6    20    21    22    23
#                  7    24    25    26    27
#                  8    28    29    30    31
#             2001 6    68    69    70    71
#                  7    72    73    74    75
#                  8    76    77    78    79
#             2002 6   116   117   118   119
#                  7   120   121   122   123

我想根据纬度值(例如大于30)对数据集进行切片。我从pandas MultiIndex / Advanced Indexing文档中查阅过,但没有发现任何有用的信息。无论如何,我可以这样做吗? / p>

1 个答案:

答案 0 :(得分:0)

一般来说,在多索引中使用tupel并不是一个好主意。多索引本身就是一个元组,您会遇到麻烦。但是,为什么要结合使用latlong?如果您使用

miindex = pd.MultiIndex.from_product([lat,long,years, months], names=['lat', 'long', 'year', 'month'])

您可以这样写:

dfmi.loc[(slice(30, None), slice(None), slice(None), slice(None)), :]

dfmi.query("lat > 30")

Here,您可以找到有关切片多索引的非常好的概述。