如何根据二级标准从多索引 pandas.Series 对象中提取?
How to extract from a multi-indexed pandas.Series object based on secondary level criterion?
我在下面有一个 pandas DataFrame 示例对象,我在其上执行分组相关性计算。最后我想查看 Value1
和 Value2
之间的时间序列相关性
data = [
(1, 'alpha', 3, 101, 2),
(1, 'beta', 2, 102, 3),
(1, 'gamma', 5, 103, 4),
(2, 'alpha', 2.5, 101, 1),
(2, 'beta', 2.2, 105, 2),
(2, 'gamma', 5, 100, 0),
(3, 'alpha', 2.1, 102, 0),
(3, 'beta', 2.0, 102, 3.3),
(3, 'gamma', 5, 100, 2),
]
datapd = pandas.DataFrame(data, columns=('Time', 'ID', 'Value1', 'Value2', 'Value3'))
corrvals = datapd.groupby('Time').corr()
所以当我查看 corrvals['Value1']
时,我只想 select 所有 Value2
项。然而,他们处于 Time
之后的水平。例如。 corrvals['Value1'].index.values
显示:
array([(1, 'Value1'), (1, 'Value2'), (1, 'Value3'), (2, 'Value1'),
(2, 'Value2'), (2, 'Value3'), (3, 'Value1'), (3, 'Value2'),
(3, 'Value3')], dtype=object)
如何在第二个元组中请求索引为 Value2
且对第一个元组没有要求的所有值?
您可以使用新的 IndexSlice
:
In [17]:
idx = pd.IndexSlice
corrvals.loc[idx[:,'Value2']]
Out[17]:
Time
1 Value1 0.654654
Value2 1.000000
Value3 1.000000
2 Value1 -0.725288
Value2 1.000000
Value3 0.944911
3 Value1 -0.999569
Value2 1.000000
Value3 -0.121560
Name: Value2, dtype: float64
或Slice
:
In [18]:
corrvals.loc[slice(None),'Value2']
Out[18]:
Time
1 Value1 0.654654
Value2 1.000000
Value3 1.000000
2 Value1 -0.725288
Value2 1.000000
Value3 0.944911
3 Value1 -0.999569
Value2 1.000000
Value3 -0.121560
Name: Value2, dtype: float64
或将axis=0
传给loc
:
In [19]:
corrvals.loc(axis=0)[:,'Value2']
Out[19]:
Value1 Value2 Value3
Time
1 Value2 0.654654 1 1.000000
2 Value2 -0.725288 1 0.944911
3 Value2 -0.999569 1 -0.121560
我想指出这个警告 here 因为你有不同的结果:
In [13]: idx = pd.IndexSlice
这将在 COLUMNS 上进行选择。因为这与 corrvals.loc[:,'Value2']
完全相同,例如典型的列选择
In [15]: corrvals.loc[idx[:,'Value2']]
Out[15]:
Time
1 Value1 0.654654
Value2 1.000000
Value3 1.000000
2 Value1 -0.725288
Value2 1.000000
Value3 0.944911
3 Value1 -0.999569
Value2 1.000000
Value3 -0.121560
Name: Value2, dtype: float64
这在 INDEX 上选择。 (注意尾随的逗号)。
In [16]: corrvals.loc[idx[:,'Value2'],]
Out[16]:
Value1 Value2 Value3
Time
1 Value2 0.654654 1 1.000000
2 Value2 -0.725288 1 0.944911
3 Value2 -0.999569 1 -0.121560
最后,还有另一种方法来进行此选择,使用 .query
。 ilevel_1
是第 1 级的绰号(从 0 开始编号),因为它没有名称。
In [18]: corrvals.index.names
Out[18]: FrozenList([u'Time', None])
In [17]: corrvals.query('ilevel_1=="Value2"')
Out[17]:
Value1 Value2 Value3
Time
1 Value2 0.654654 1 1.000000
2 Value2 -0.725288 1 0.944911
3 Value2 -0.999569 1 -0.121560
您可以重命名关卡。
In [19]: corrvals.index = corrvals.index.set_names(['Time','Values'])
那么查询就简单了
In [20]: corrvals.query('Values=="Value2"')
Out[20]:
Value1 Value2 Value3
Time Values
1 Value2 0.654654 1 1.000000
2 Value2 -0.725288 1 0.944911
3 Value2 -0.999569 1 -0.121560
我在下面有一个 pandas DataFrame 示例对象,我在其上执行分组相关性计算。最后我想查看 Value1
和 Value2
data = [
(1, 'alpha', 3, 101, 2),
(1, 'beta', 2, 102, 3),
(1, 'gamma', 5, 103, 4),
(2, 'alpha', 2.5, 101, 1),
(2, 'beta', 2.2, 105, 2),
(2, 'gamma', 5, 100, 0),
(3, 'alpha', 2.1, 102, 0),
(3, 'beta', 2.0, 102, 3.3),
(3, 'gamma', 5, 100, 2),
]
datapd = pandas.DataFrame(data, columns=('Time', 'ID', 'Value1', 'Value2', 'Value3'))
corrvals = datapd.groupby('Time').corr()
所以当我查看 corrvals['Value1']
时,我只想 select 所有 Value2
项。然而,他们处于 Time
之后的水平。例如。 corrvals['Value1'].index.values
显示:
array([(1, 'Value1'), (1, 'Value2'), (1, 'Value3'), (2, 'Value1'),
(2, 'Value2'), (2, 'Value3'), (3, 'Value1'), (3, 'Value2'),
(3, 'Value3')], dtype=object)
如何在第二个元组中请求索引为 Value2
且对第一个元组没有要求的所有值?
您可以使用新的 IndexSlice
:
In [17]:
idx = pd.IndexSlice
corrvals.loc[idx[:,'Value2']]
Out[17]:
Time
1 Value1 0.654654
Value2 1.000000
Value3 1.000000
2 Value1 -0.725288
Value2 1.000000
Value3 0.944911
3 Value1 -0.999569
Value2 1.000000
Value3 -0.121560
Name: Value2, dtype: float64
或Slice
:
In [18]:
corrvals.loc[slice(None),'Value2']
Out[18]:
Time
1 Value1 0.654654
Value2 1.000000
Value3 1.000000
2 Value1 -0.725288
Value2 1.000000
Value3 0.944911
3 Value1 -0.999569
Value2 1.000000
Value3 -0.121560
Name: Value2, dtype: float64
或将axis=0
传给loc
:
In [19]:
corrvals.loc(axis=0)[:,'Value2']
Out[19]:
Value1 Value2 Value3
Time
1 Value2 0.654654 1 1.000000
2 Value2 -0.725288 1 0.944911
3 Value2 -0.999569 1 -0.121560
我想指出这个警告 here 因为你有不同的结果:
In [13]: idx = pd.IndexSlice
这将在 COLUMNS 上进行选择。因为这与 corrvals.loc[:,'Value2']
完全相同,例如典型的列选择
In [15]: corrvals.loc[idx[:,'Value2']]
Out[15]:
Time
1 Value1 0.654654
Value2 1.000000
Value3 1.000000
2 Value1 -0.725288
Value2 1.000000
Value3 0.944911
3 Value1 -0.999569
Value2 1.000000
Value3 -0.121560
Name: Value2, dtype: float64
这在 INDEX 上选择。 (注意尾随的逗号)。
In [16]: corrvals.loc[idx[:,'Value2'],]
Out[16]:
Value1 Value2 Value3
Time
1 Value2 0.654654 1 1.000000
2 Value2 -0.725288 1 0.944911
3 Value2 -0.999569 1 -0.121560
最后,还有另一种方法来进行此选择,使用 .query
。 ilevel_1
是第 1 级的绰号(从 0 开始编号),因为它没有名称。
In [18]: corrvals.index.names
Out[18]: FrozenList([u'Time', None])
In [17]: corrvals.query('ilevel_1=="Value2"')
Out[17]:
Value1 Value2 Value3
Time
1 Value2 0.654654 1 1.000000
2 Value2 -0.725288 1 0.944911
3 Value2 -0.999569 1 -0.121560
您可以重命名关卡。
In [19]: corrvals.index = corrvals.index.set_names(['Time','Values'])
那么查询就简单了
In [20]: corrvals.query('Values=="Value2"')
Out[20]:
Value1 Value2 Value3
Time Values
1 Value2 0.654654 1 1.000000
2 Value2 -0.725288 1 0.944911
3 Value2 -0.999569 1 -0.121560