先打个广告:欢迎关注我的公众号,参与 文史大挑战 趣味题目。使用方法见 这篇文章 。
![公众号:晚花行乐](/resource/image/blog/wechat-official-account/qr.jpg)
正文开始:
Pandas 一些函数带有 axis 的参数,对刚刚开始使用 Pandas 的新手来说,不好理解。网上有其他文章解释,但是感觉没有讲透。本文试着解释这个 axis 参数的含义。
问题
>>> import pandas as pd
>>>
>>> table = {
... "A": [1, 2, 3],
... "B": [4, 5, 6],
... "C": [7, 8, 9],
... }
>>>
>>> df = pd.DataFrame(table) # 从 dict 初始化
>>> df.sum(axis=0) # 沿 axis = 0 求和
A 6
B 15
C 24
dtype: int64
>>> df.sum(axis=1) # 沿 axis = 1 求和
0 12
1 15
2 18
dtype: int64
>>> df.drop(['B']) # drop 不指定 axis, 报错
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/.../frame.py", line 5581, in drop
return super().drop()
File "/.../generic.py", line 4788, in drop
obj = obj._drop_axis(labels, axis, level=level, errors=errors)
File "/.../generic.py", line 4830, in _drop_axis
new_axis = axis.drop(labels, errors=errors)
File "/.../base.py", line 7070, in drop
raise KeyError(f"{labels[mask].tolist()} not found in axis")
KeyError: "['B'] not found in axis"
>>> df.drop(['B'], axis=1) # drop 需要指定 axis=1
A C
0 1 7
1 2 8
2 3 9
>>>
观察上面的 sum()
和 drop()
函数,当 axis=1
时, sum()
得到是按行求和,而 drop()
是按列操作,似乎参数的含义不统一。
下面尝试解释这个现象,我们从最常见的一维数组开始:
1维的情况
对于一维数组:
A = [1, 2, 3, 4, 5]
要想索引数组中的元素(可以理解为1维空间中的点),可以用一个数字作为下标:
A[2]
2维的情况
当一维数组中的某一个元素变成数组后,就扩张出了新的维度:
A = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
]
要想索引数组最内层的元素(可以理解为2维空间中的点),需要用2个数字作为下标:
A[2][1]
这种表示法类似二维平面的 $(2, 1)$,最前面的 $2$ 称为第1维, 往后面的 $1$ 称为第2维。
数组的索引式中,靠前的 [2]
表示 A
最外层的索引,称为第1维;靠后的 [1]
表示 A
向内一层的索引,称为第2维。
上面数组的例子,是从最高维向下扩展维度,下面我们反方向观察如何向上扩展维度。
从一个标量开始
首先是一个标量开始,也就是空间中的点
1
多个点组合在一起,构成一个1维空间,扩展称为向量:
a = [1, 2, 3]
这时用一个坐标就可以指代任何一个点:
a[2]
这里的 $2$ 是第一维,也就是最外层的维度
当多个1维空间组合在一起,构成一个二维空间:
a1 = [1, 2, 3]
a2 = [4, 5, 6]
a3 = [7, 8, 9]
A = [a1, a2, a3]
注意:原来的空间被新的空间包裹起来,那么新扩张出的维度就变成了最外层,也就是第1维。原来的第1维,现在降到了第2维。
Pandas 的数据结构
Pandas 中的 Series 是个一维结构,DataFrame 是一个二维结构。 DataFrame 是 Series 更高维度的容器,
还是用 前面问题一节 中的例子:
>>> import pandas as pd
>>>
>>> table = {
... "A": [1, 2, 3],
... "B": [4, 5, 6],
... "C": [7, 8, 9],
... }
最外层是 column 层,属于第1维,axis=0;内层是 index,坐标作为 Series 的坐标, 属于第2维,axis=1
如何理解 sum() 函数中的 axis 参数
观察下面这个 Dataframe
![](/resource/image/tech/pandas-axis/pandas-index-axis-0.png)
df.sum(axis=0)
中的 axis 参数指沿着 index 轴求和。“沿着 index 轴” 可以理解为:保留 index 轴,而将 column 维度坍塌到 index 轴。
![](/resource/image/tech/pandas-axis/pandas-index-axis-1.png)
df.sum(axis=1)
中的 axis 参数指沿着 column 轴求和。“沿着 column 轴” 可以理解为:保留 column 轴,而将 index 维度坍塌到 column 轴。
![](/resource/image/tech/pandas-axis/pandas-index-axis-2.png)
如果您对本文有疑问或者寻求合作,欢迎 联系邮箱 。邮箱已到剪贴板
精彩评论
本站 是个人网站,采用 署名协议 CC-BY-NC 授权。
欢迎转载,请保留原文链接 https://www.lfhacks.com/tech/pandas-axis/ ,且不得用于商业用途。