本系列文章配套代码获取有以下三种途径:
-
可以在以下网站查看,该网站是使用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》翻译整理
—————-————————————-
pandas处理具有不同索引的对象很简单。当添加对象索引对不相同时,结果中各自的索引将是添加对象索引对的联合。
1.Series间的对齐运算:
具有不同索引的Series对象之间进行算术操作时,如果存在某个索引对不相同时,返回的结果将是索引对的并集,在没有交集的位置会用NaN值来填充缺失值,然后缺失值将在进一步的算术计算中传播。
1>>> s1 = pd.Series([1,2,3,4],index=["a", "c", "d", "e"])
2>>> s1
3a 1
4c 2
5d 3
6e 4
7dtype: int64
8
9>>> s2 = pd.Series([5,6,7,8,9],index=["a", "c", "e", "f", "g"])
10>>> s2
11a 5
12c 6
13e 7
14f 8
15g 9
16dtype: int64
17
18>>> s1 + s2
19a 6.0
20c 8.0
21d NaN
22e 11.0
23f NaN
24g NaN
25dtype: float64
2.DataFrame间的对齐运算:
在 DataFrame 的情况下,对行和列都会执行对齐操作。
例如下面操作中,两个具有不同行列索引的DataFrame 对象执行算术运算之后,返回的结果对象中索引和列是两个 DataFrame 对象的联合:
1>>> df1 = pd.DataFrame(np.arange(9).reshape((3,3)),columns=['a','b','c'],index=['行1','行2','行3'])
2>>> df1
3 a b c
4行1 0 1 2
5行2 3 4 5
6行3 6 7 8
7
8>>> df2 = pd.DataFrame(np.arange(12).reshape((4,3)),columns=['b','d','e'],index=['行4','行2','行3','行5'])
9>>> df2
10 b d e
11行4 0 1 2
12行2 3 4 5
13行3 6 7 8
14行5 9 10 11
15
16>>> df1 + df2
17 a b c d e
18行1 NaN NaN NaN NaN NaN
19行2 NaN 7.0 NaN NaN NaN
20行3 NaN 13.0 NaN NaN NaN
21行4 NaN NaN NaN NaN NaN
22行5 NaN NaN NaN NaN NaN
3.使用填充值的对齐运算:
在不同索引对象之间的算术运算中,当在一个对象中找到轴标签但在另一个对象中找不到时,在使用下面的灵活算术方法时,可以通过fill_value
参数设定填充的特殊值,例如 0。
方法 |
说明 |
add, radd | 加法(+) |
sub, rsub | 减法(-) |
div, rdiv | 除法(/) |
floordiv, rfloordiv | 整除(//) |
mul, rmul | 乘法(*) |
pow, rpow | 幂次方(**) |
fill_value参数可以在计算之前对于一边出现缺失值的情况进行填充。也就是说对于只在一个DataFrame中缺失的位置会被替换成我们指定的值,如果在两个DataFrame都缺失,那么依然还会是Nan。
1>>> df1
2 a b c
3行1 0 1 2
4行2 3 4 5
5行3 6 7 8
6
7>>> df2
8 b d e
9行4 0 1 2
10行2 3 4 5
11行3 6 7 8
12行5 9 10 11
13
14>>> df1.add(df2 , fill_value=0)
15 a b c d e
16行1 0.0 1.0 2.0 NaN NaN
17行2 3.0 7.0 5.0 4.0 5.0
18行3 6.0 13.0 8.0 7.0 8.0
19行4 NaN 0.0 NaN 1.0 2.0
20行5 NaN 9.0 NaN 10.0 11.0
4.Series和DataFrame间的对齐运算:
DataFrame和Series间的算术操作与Numpy中不同维度数组间的操作类似。默认情况下,DataFrame和Series间的算术操作会将Series的索引与DataFrame的列进行匹配,并广播到各行。
1>>> dataframe = pd.DataFrame(np.arange(12).reshape((4,3)),columns=['b','d','e'],index=['行1','行2','行3','行4'])
2>>> dataframe
3 b d e
4行1 0 1 2
5行2 3 4 5
6行3 6 7 8
7行4 9 10 11
8
9>>> series = dataframe.iloc[0]
10>>> series
11b 0
12d 1
13e 2
14Name: 行1, dtype: int32
15
16>>> dataframe - series
17 b d e
18行1 0 0 0
19行2 3 3 3
20行3 6 6 6
21行4 9 9 9
如果一个索引值不在DataFrame的列中,也不在Series的索引中,则对象会重建索引并形成联合。
1>>> dataframe = pd.DataFrame(np.arange(12).reshape((4,3)),columns=['b','d','e'],index=['行1','行2','行3','行4'])
2>>> dataframe
3 b d e
4行1 0 1 2
5行2 3 4 5
6行3 6 7 8
7行4 9 10 11
8
9>>> series = pd.Series(range(3),index=['b','e','f'])
10>>> series
11b 0
12e 1
13f 2
14dtype: int64
15
16>>> dataframe + series
17 b d e f
18行1 0.0 NaN 3.0 NaN
19行2 3.0 NaN 6.0 NaN
20行3 6.0 NaN 9.0 NaN
21行4 9.0 NaN 12.0 NaN
也可以通过传递axis值用于在列上进行广播操作。
1>>> dataframe = pd.DataFrame(np.arange(12).reshape((4,3)),columns=['b','d','e'],index=['行1','行2','行3','行4'])
2>>> dataframe
3 b d e
4行1 0 1 2
5行2 3 4 5
6行3 6 7 8
7行4 9 10 11
8
9>>> series = dataframe['d']
10>>> series
11行1 1
12行2 4
13行3 7
14行4 10
15Name: d, dtype: int32
16
17>>> dataframe.sub(series,axis=0)
18 b d e
19行1 -1 0 1
20行2 -1 0 1
21行3 -1 0 1
22行4 -1 0 1
本篇文章来源于微信公众号: 码农设计师