本系列文章配套代码获取有以下三种途径:
-
可以在以下网站查看,该网站是使用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》翻译整理
—————————————————–
另一种数据组合操作称为拼接或堆叠。Numpy的concatenate
函数可以在numpy数组上实现该功能。
1>>> arr = np.arange(12).reshape((3, 4))
2>>> arr
3array([[ 0, 1, 2, 3],
4 [ 4, 5, 6, 7],
5 [ 8, 9, 10, 11]])
6
7>>> np.concatenate([arr,arr],axis=1)
8array([[ 0, 1, 2, 3, 0, 1, 2, 3],
9 [ 4, 5, 6, 7, 4, 5, 6, 7],
10 [ 8, 9, 10, 11, 8, 9, 10, 11]])
Pandas中的concat函数提供了与Numpy类似的操作。
1.Series对象:
默认情况下,pandas.concat方法是沿着axis=”index”的轴生效。可以传递axis=”columns”,改变生效轴。
1>>> s1 = pd.Series([0, 1, 2], index=["a", "b", "c"], dtype="Int64")
2>>> s2 = pd.Series([3, 4, 5], index=["c", "d", "e"], dtype="Int64")
3>>> s3 = pd.Series([6, 7], index=["f", "g"], dtype="Int64")
4
5>>> pd.concat([s1,s2,s3])
6a 0
7b 1
8c 2
9c 3
10d 4
11e 5
12f 6
13g 7
14dtype: Int64
15
16>>> pd.concat([s1,s2,s3],axis="columns")
17 0 1 2
18a 0 <NA> <NA>
19b 1 <NA> <NA>
20c 2 3 <NA>
21d <NA> 4 <NA>
22e <NA> 5 <NA>
23f <NA> <NA> 6
24g <NA> <NA> 7
可以看到上述操作的结果是全部索引的并集(外连接“outer”),可以通过传递join=”inner”来改变。
1>>> pd.concat([s1,s2],axis="columns",join="inner")
2 0 1
3c 2 3
一个潜在的问题是连接的各部分在结果中无法识别。假设你想在连接轴上创建分层索引,可以使用 keys参数。
在沿 axis="columns"
组合 Series 的情况下,keys成为 DataFrame 列头。
1>>> pd.concat([s1,s2,s3],keys=["one","two","three"])
2one a 0
3 b 1
4 c 2
5two c 3
6 d 4
7 e 5
8three f 6
9 g 7
10dtype: Int64
11
12>>> pd.concat([s1,s2,s3],axis="columns",keys=["one","two","three"])
13 one two three
14a 0 <NA> <NA>
15b 1 <NA> <NA>
16c 2 3 <NA>
17d <NA> 4 <NA>
18e <NA> 5 <NA>
19f <NA> <NA> 6
20g <NA> <NA> 7
2.DataFrame 对象:
将同样的逻辑扩展到DataFrame 对象中。keys参数将用于创建层次索引,其中第一级可用于标识每个串联的 DataFrame 对象。
1>>> df1 = pd.DataFrame(np.arange(6).reshape(3, 2), index=["a", "b", "c"],columns=["one", "two"])
2>>> df1
3 one two
4a 0 1
5b 2 3
6c 4 5
7
8>>> df2 = pd.DataFrame(5 + np.arange(4).reshape(2, 2), index=["a", "c"],columns=["three", "four"])
9>>> df2
10 three four
11a 5 6
12c 7 8
13
14>>> pd.concat([df1,df2],axis="columns",keys=["L1","L2"])
15 L1 L2
16 one two three four
17a 0 1 5.0 6.0
18b 2 3 NaN NaN
19c 4 5 7.0 8.0
如果你传递一个字典对象而不是一个列表,字典的键将用于 keys 参数。
1>>> pd.concat({"L1":df1 , "L2":df2},axis="columns")
2 L1 L2
3 one two three four
4a 0 1 5.0 6.0
5b 2 3 NaN NaN
6c 4 5 7.0 8.0
还有其他参数控制如何创建层次索引。例如,我们可以使用 names
参数命名创建的轴层级。
1>>> pd.concat([df1,df2],axis="columns",keys=["L1","L2"],names=["一","二"])
2一 L1 L2
3二 one two three four
4a 0 1 5.0 6.0
5b 2 3 NaN NaN
6c 4 5 7.0 8.0
最后要考虑的是行索引不包含任何相关数据的 DataFrame。
在这种情况下,你可以传递 ignore_index=True
,它会丢弃每个 DataFrame 中的索引并仅连接列中的数据,分配一个新的默认索引。
1>>> df1 = pd.DataFrame(np.arange(9).reshape((3,3)),columns=["a", "b", "c"])
2>>> df1
3 a b c
40 0 1 2
51 3 4 5
62 6 7 8
7
8>>> df2 = pd.DataFrame(np.arange(10,16).reshape((2,3)),columns=["b", "d", "a"])
9>>> df2
10 b d a
110 10 11 12
121 13 14 15
13
14>>> pd.concat([df1,df2])
15 a b c d
160 0 1 2.0 NaN
171 3 4 5.0 NaN
182 6 7 8.0 NaN
190 12 10 NaN 11.0
201 15 13 NaN 14.0
21
22>>> pd.concat([df1,df2],ignore_index=True)
23 a b c d
240 0 1 2.0 NaN
251 3 4 5.0 NaN
262 6 7 8.0 NaN
273 12 10 NaN 11.0
284 15 13 NaN 14.0
pandas.concat
函数的参数:
参数 |
说明 |
objs | 需要连接的pandas对象列表或字典,是必选参数 |
axis | 连接的轴,默认为沿行方向 (axis=”index”) |
join | 用于指定连接方式"inner" 或者"outer" (默认为"outer" ) |
keys | 与要连接的对象关联的值,沿着连接轴形成分层索引,可以是任意值的列表或数组,也可以是元祖的数组,也可以是数组的列表(如果要向levels参数传入多层数组) |
levels | 在键值传递时,用于指定多层索引的层级 |
names | 如果传入了keys and/or levels 参数,改参数用于指定多层索引的名称 |
verify_integrity | 检查连接对象中的新轴是否重复,如果是,则发生异常;默认为False,允许重复 |
ignore_index | 不沿着连接轴保留索引,而产生一段新的索引(range(total_length)) |
本篇文章来源于微信公众号: 码农设计师