熊猫的多指标的好处?(Benefits of panda's multiindex?)

2019-06-18 19:54发布

所以,我才知道,我可以使用DataFrame.groupby而无需多指标做二次采样/横截面。

在另一方面,当我有一个多指标上的数据帧,我仍然需要使用DataFrame.groupby做子采样/横截面。

那么,什么是从层次结构的非常有益的和漂亮的显示器打印时多指标一个很好的分开?

Answer 1:

分层索引(也被称为“多级”索引)在大熊猫0.4版本中引入的。

这将打开大门,一些比较复杂的数据分析和处理,特别是对高维数据的工作。 从本质上说,它使您能够有效地存储和在2维片状结构(数据帧)操纵任意高维数据,例如。

想象一下,构建使用数据帧MultiIndex如下: -

import pandas as pd
import numpy as np

np.arrays = [['one','one','one','two','two','two'],[1,2,3,1,2,3]]

df = pd.DataFrame(np.random.randn(6,2),index=pd.MultiIndex.from_tuples(list(zip(*np.arrays))),columns=['A','B'])

df  # This is the dataframe we have generated

          A         B
one 1 -0.732470 -0.313871
    2 -0.031109 -2.068794
    3  1.520652  0.471764
two 1 -0.101713 -1.204458
    2  0.958008 -0.455419
    3 -0.191702 -0.915983

df只是两个维度的数据结构

df.ndim

2

但是,我们可以把它想象,看着输出,3维数据结构。

  • one1与数据-0.732470 -0.313871
  • one2与数据-0.031109 -2.068794
  • one3与数据1.520652 0.471764

又名:“有效地存储和在2维表格结构操纵任意高维数据”

这不只是一个“漂亮的显示”。 它具有数据的检索方便的好处,因为我们现在有一个层次的索引。

例如。

In [44]: df.ix["one"]
Out[44]: 
          A         B
1 -0.732470 -0.313871
2 -0.031109 -2.068794
3  1.520652  0.471764

会给我们一个新的数据帧只为组属于“一”的数据。

我们可以通过这样进一步缩小我们的数据选择: -

In [45]: df.ix["one"].ix[1]
Out[45]: 
A   -0.732470
B   -0.313871
Name: 1

当然,如果我们想要一个特定的值,这里有一个例子: -

In [46]: df.ix["one"].ix[1]["A"]
Out[46]: -0.73247029752040727

所以,如果我们有更多的指标(除了在上面的例子中所示的2个索引),我们基本上可以向下钻取并选择数据集我们是在没有需要真正感兴趣groupby

我们甚至可以抓住从我们的数据帧的横截面(行或列)...

按行: -

In [47]: df.xs('one')
Out[47]: 
          A         B
1 -0.732470 -0.313871
2 -0.031109 -2.068794
3  1.520652  0.471764

通过列: -

In [48]: df.xs('B', axis=1)
Out[48]: 
one  1   -0.313871
     2   -2.068794
     3    0.471764
two  1   -1.204458
     2   -0.455419
     3   -0.915983
Name: B


Answer 2:

伟大的职位由@Calvin程,但想到我会带刺在这一点。

当使用多指标:

  1. 当单个列的值是不够的,唯一标识一行。
  2. 当数据在逻辑上是分层的 - 这意味着它有多个维度或“级别”。

为什么(你的核心问题) - 至少这些都是最大的好处IMO:

  1. 通过堆容易操纵()和拆散()
  2. 当有多个列的水平简单的数学
  3. 语法糖切片/过滤

例:

                                                       Dollars  Units
Date       Store   Category Subcategory UPC EAN
2018-07-10 Store 1 Alcohol  Liqour      80480280024    154.77      7
           Store 2 Alcohol  Liqour      80480280024     82.08      4
           Store 3 Alcohol  Liqour      80480280024    259.38      9
           Store 1 Alcohol  Liquor      80432400630    477.68     14
                                        674545000001   139.68      4
           Store 2 Alcohol  Liquor      80432400630    203.88      6
                                        674545000001   377.13     13
           Store 3 Alcohol  Liquor      80432400630    239.19      7
                                        674545000001   432.32     14
           Store 1 Beer     Ales        94922755711     65.17      7
                                        702770082018   174.44     14
                                        736920111112    50.70      5
           Store 2 Beer     Ales        94922755711    129.60     12
                                        702770082018   107.40     10
                                        736920111112    59.65      5
           Store 3 Beer     Ales        94922755711    154.00     14
                                        702770082018   137.40     10
                                        736920111112   107.88     12
           Store 1 Beer     Lagers      702770081011   156.24     12
           Store 2 Beer     Lagers      702770081011   137.06     11
           Store 3 Beer     Lagers      702770081011   119.52      8    

1)如果我们想要轻松跨店销售相比较,我们可以使用df.unstack('Store')排队一切行动并排侧:

                                             Dollars                   Units
Store                                        Store 1 Store 2 Store 3 Store 1 Store 2 Store 3
Date       Category Subcategory UPC EAN
2018-07-10 Alcohol  Liqour      80480280024   154.77   82.08  259.38       7       4       9
                    Liquor      80432400630   477.68  203.88  239.19      14       6       7
                                674545000001  139.68  377.13  432.32       4      13      14
           Beer     Ales        94922755711    65.17  129.60  154.00       7      12      14
                                702770082018  174.44  107.40  137.40      14      10      10
                                736920111112   50.70   59.65  107.88       5       5      12
                    Lagers      702770081011  156.24  137.06  119.52      12      11       8

2)我们也可以很容易地做多列数学。 例如, df['Dollars'] / df['Units']由它的单位,然后将将每个商店的美元无需多次操作每家商店:

Store                                         Store 1  Store 2  Store 3
Date       Category Subcategory UPC EAN
2018-07-10 Alcohol  Liqour      80480280024     22.11    20.52    28.82
                    Liquor      80432400630     34.12    33.98    34.17
                                674545000001    34.92    29.01    30.88
           Beer     Ales        94922755711      9.31    10.80    11.00
                                702770082018    12.46    10.74    13.74
                                736920111112    10.14    11.93     8.99
                    Lagers      702770081011    13.02    12.46    14.94

3)然后如果我们想要过滤的,而不是使用只是特定行,

df[(df[col1] == val1) and (df[col2] == val2) and (df[col3] == val3)]

格式,我们可以改为.xs或.query(是的,这些工作经常DFS,但它不是非常有用)。 语法将变为:

df.xs((val1, val2, val3), level=(col1, col2, col3))

更多的例子可以在此找到教程笔记本我放在一起。



文章来源: Benefits of panda's multiindex?