本系列文章配套代码获取有以下三种途径:
-
可以在以下网站查看,该网站是使用JupyterLite搭建的web端Jupyter环境,因此无需在本地安装运行环境即可使用,首次运行浏览器需要下载一些配置文件(大约20M):
https://returu.github.io/Python_Data_Analysis/lab/index.html
-
也可以通过百度网盘获取,需要在本地配置代码运行环境,环境配置可以查看【Python基础】2.搭建Python开发环境:
链接: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([0, 1, 2, 3], index=["a", "b", "c", "d"], dtype="Int64")
2>>> s2 = pd.Series([4, 5, 6], 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
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
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
本篇文章来源于微信公众号: 码农设计师