如何从多索引数据中提取Pandas系列基于二级标准的对象?

2024-07-04 05:22:52 发布

您现在位置:Python中文网/ 问答频道 /正文

下面有一个pandas DataFrame示例对象,我在这个对象上执行一个group by correlation计算。最后,我想看看Value1Value2之间的时间序列相关性

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']时,我只想选择所有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在第二个元组中的所有值,而在第一个元组中没有要求?你知道吗


Tags: 对象alpha示例dataframepandasdatatimebeta
2条回答

我想指出这个警告here,因为您在以下两种情况下得到了不同的结果:

In [13]: idx = pd.IndexSlice

这将在列上选择。因为这与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

这将在索引上选择。(注意后面的逗号)。你知道吗

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

最后,这里是另一种选择方法,使用.queryilevel_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

您可以使用新的^{}

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

相关问题 更多 >

    热门问题