所以,我才知道,我可以使用DataFrame.groupby而无需多指标做二次采样/横截面。
在另一方面,当我有一个多指标上的数据帧,我仍然需要使用DataFrame.groupby做子采样/横截面。
那么,什么是从层次结构的非常有益的和漂亮的显示器打印时多指标一个很好的分开?
所以,我才知道,我可以使用DataFrame.groupby而无需多指标做二次采样/横截面。
在另一方面,当我有一个多指标上的数据帧,我仍然需要使用DataFrame.groupby做子采样/横截面。
那么,什么是从层次结构的非常有益的和漂亮的显示器打印时多指标一个很好的分开?
分层索引(也被称为“多级”索引)在大熊猫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维数据结构。
one
与1
与数据-0.732470 -0.313871
。 one
与2
与数据-0.031109 -2.068794
。 one
与3
与数据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
伟大的职位由@Calvin程,但想到我会带刺在这一点。
当使用多指标:
为什么(你的核心问题) - 至少这些都是最大的好处IMO:
例:
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))
更多的例子可以在此找到教程笔记本我放在一起。