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

【Python数据分析】19.Pandas对齐运算


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

  • 可以在以下网站查看,该网站是使用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》翻译整理

—————-————————————-

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
41  0  1  2
52  3  4  5
63  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
114  0   1   2
122  3   4   5
133  6   7   8
145  9  10  11
15
16>>> df1 + df2
17     a     b   c   d   e
181 NaN   NaN NaN NaN NaN
192 NaN   7.0 NaN NaN NaN
203 NaN  13.0 NaN NaN NaN
214 NaN   NaN NaN NaN NaN
225 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
31  0  1  2
42  3  4  5
53  6  7  8
6
7>>> df2
8    b   d   e
94  0   1   2
102  3   4   5
113  6   7   8
125  9  10  11
13
14>>> df1.add(df2 , fill_value=0)
15      a     b    c     d     e
161  0.0   1.0  2.0   NaN   NaN
172  3.0   7.0  5.0   4.0   5.0
183  6.0  13.0  8.0   7.0   8.0
194  NaN   0.0  NaN   1.0   2.0
205  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
41  0   1   2
52  3   4   5
63  6   7   8
74  9  10  11
8
9>>> series = dataframe.iloc[0]
10>>> series
11b    0
12d    1
13e    2
14Name: 行1dtype: int32
15
16>>> dataframe - series
17    b  d  e
181  0  0  0
192  3  3  3
203  6  6  6
214  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
41  0   1   2
52  3   4   5
63  6   7   8
74  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
181  0.0 NaN   3.0 NaN
192  3.0 NaN   6.0 NaN
203  6.0 NaN   9.0 NaN
214  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
41  0   1   2
52  3   4   5
63  6   7   8
74  9  10  11
8
9>>> series = dataframe['d']
10>>> series
111     1
122     4
133     7
144    10
15Name: d, dtype: int32
16
17>>> dataframe.sub(series,axis=0)
18    b  d  e
191 -1  0  1
202 -1  0  1
213 -1  0  1
224 -1  0  1


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

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments