首页Python【Python数据分析】4...

【Python数据分析】44.数据规整——重塑和透视1(使用多层索引进行重塑)


本系列文章配套代码获取有以下三种途径:

  • 可以在以下网站查看,该网站是使用JupyterLite搭建的web端Jupyter环境,因此无需在本地安装运行环境即可使用,首次运行浏览器需要下载一些配置文件(大约20M):

https://returu.github.io/Python_Data_Analysis/lab/index.html
链接:https://pan.baidu.com/s/1MYkeYeVAIRqbxezQECHwcA?pwd=mnsj 提取码:mnsj
  • 前往GitHub详情页面,单击 code 按钮,选择Download ZIP选项:
https://github.com/returu/Python_Data_Analysis

根据《Python for Data Analysis 3rd Edition》翻译整理

—————————————————–

重拍类表格型数据有多重基础操作,这些操作被称为重塑(reshape)或透视(pivot)。

1.通过多层索引进行重塑:

分层索引提供了一种一致性方式重排列DataFrame中的数据。有以下两个主要操作:

stack:

该操作会“旋转”或将列中的数据透视到行。

unstack:

该操作会将行中的数据透视到列。

 1>>> df = pd.DataFrame(np.arange(6).reshape((2,3)),
2...                   index=pd.Index(['ios','andiord'],name='style'),
3...                   columns=pd.Index(['one','two','three'],name='number'))
4>>> df
5number   one  two  three
6style
7ios        0    1      2
8andiord    3    4      5
9
10>>> df_stack = df.stack()
11>>> df_stack
12style    number
13ios      one       0
14         two       1
15         three     2
16andiord  one       3
17         two       4
18         three     5
19dtype: int32
20
21>>> df_stack.unstack()
22number   one  two  three
23style
24ios        0    1      2
25andiord    3    4      5

默认情况下,unstack 拆堆最内层,可以传入一个层级序号或名称来拆分不同的层级。

 1>>> df_stack.unstack(1)
2number   one  two  three
3style
4ios        0    1      2
5andiord    3    4      5
6
7>>> df_stack.unstack(0)
8style   ios  andiord
9number
10one       0        3
11two       1        4
12three     2        5
13
14>>> df_stack.unstack("style")
15style   ios  andiord
16number
17one       0        3
18two       1        4
19three     2        5

如果层级中所有值并未包含与每个子分组中时,拆分会引入缺失值。

 1>>> s1 = pd.Series([0123], index=["a""b""c""d"], dtype="Int64")
2>>> s2 = pd.Series([456], index=["c""d""e"], dtype="Int64")
3
4>>> data = pd.concat([s1,s2],keys=["one","two"])
5>>> data
6one  a    0
7     b    1
8     c    2
9     d    3
10two  c    4
11     d    5
12     e    6
13dtype: Int64
14
15>>> data.unstack()
16        a     b  c  d     e
17one     0     1  2  3  <NA>
18two  <NA>  <NA>  4  5     6

默认情况下,堆叠会过滤出缺失值,因此堆叠拆堆的操作是可逆的。可以通过设置参数dropna=False保留缺失值。

 1>>> data.unstack().stack()
2one  a    0
3     b    1
4     c    2
5     d    3
6two  c    4
7     d    5
8     e    6
9dtype: Int64
10
11# 设置dropna=False
12>>> data.unstack().stack(dropna=False)
13one  a       0
14     b       1
15     c       2
16     d       3
17     e    <NA>
18two  a    <NA>
19     b    <NA>
20     c       4
21     d       5
22     e       6
23dtype: Int64
当在DataFrame中拆堆时,被拆堆的层级会变为结果中最低的层级。
 1>>> df = pd.DataFrame({"left": df_stack, "right": df_stack + 5},columns=pd.Index(["left""right"], name="side"))
2>>> df
3side            left  right
4style   number
5ios     one        0      5
6        two        1      6
7        three      2      7
8andiord one        3      8
9        two        4      9
10        three      5     10
11
12>>> df.unstack(level="style")
13side   left         right
14style   ios andiord   ios andiord
15number
16one       0       3     5       8
17two       1       4     6       9
18three     2       5     7      10
调用 stack 时可以指定要堆叠的轴的名称。
1>>> df.unstack(level="style").stack(level="side")
2style         andiord  ios
3number side
4one    left         3    0
5       right        8    5
6two    left         4    1
7       right        9    6
8three  left         5    2
9       right       10    7


本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments