2020-004 pandas与numpy中神奇的axis

pandas与numpy中神奇的axis

最近在百奥智汇兼职,基本上比较重的工作就在数据处理,所以pandas和numpy用的比较多。

不知不觉中,pandas各种函数越用越熟练,但是总要靠结果来推算到底应该指定axis=0还是1,你有没有这种经历呢?

经过摸索,我找到了一种axis利于记忆也好解释的理论。下面一起来看看吧!

核心内容

axis是你要操作的轴。

pandas

导入包,创建一个3X4的dataframe。

import pandas as pd
import numpy as np
data = pd.DataFrame(np.random.randn(4,3))
data.sum(axis=1)  

out:

0   -0.429278
1    0.415985
2    1.555418
3    3.364704
dtype: float64

axis=1,说明我们要对第二个轴进行操作。

操作中处理的是第二个轴一共3个值,3个值被消灭了,被1个和值取代,结果是长度为4的series。

data.drop(1,axis=1) 

out:

0 2
0 -0.002617 0.345585
1 0.273499 -0.386345
2 2.602432 0.284169
3 1.570347 1.656065

同样对第二个轴进行操作。

处理的是第二个轴3个值,3个值被drop掉1列后变为2个值,结果是4X2的dataframe。

data_ = pd.DataFrame(np.random.randn(4,3))
pd.concat([data,data_],axis=1) 

out:

0 1 2 0 1 2
0 -0.002617 -0.772246 0.345585 -0.349359 -0.033281 -0.774378
1 0.273499 0.528832 -0.386345 -1.630738 0.773259 -0.953177
2 2.602432 -1.331183 0.284169 1.714436 0.115564 2.480489
3 1.570347 0.138292 1.656065 0.229122 1.489628 3.029022

处理的是第二个轴,data二轴3个值,拼接的data_二轴也为3个值,所以结果是4X6的dataframe。

data.sort_values([0],axis=1) 

out:

1 0 2
0 -0.772246 -0.002617 0.345585
1 0.528832 0.273499 -0.386345
2 -1.331183 2.602432 0.284169
3 0.138292 1.570347 1.656065

处理的是第二个轴3个值,对第一个轴name为0对应的3个值进行排序,从小到大,结果是4X3的dataframe。

来个更复杂的

下面为常见的归一化:

data.apply(lambda a:(a-np.min(a))/(np.max(a)-np.min(a)),axis=1) 

out:

0 1 2
0 0.688502 0.0 1.000000
1 0.721001 1.0 0.000000
2 1.000000 0.0 0.410653
3 0.943524 0.0 1.000000

处理的是第二个轴3个值,对第一轴每一个name对应的三个值进行归一化处理,结果是4X3的dataframe 。

强行输出就会看的更清晰:

data.apply(lambda a:print(a),axis=1) 
0   -0.002617
1   -0.772246
2    0.345585
Name: 0, dtype: float64
0    0.273499
1    0.528832
2   -0.386345
Name: 1, dtype: float64
0    2.602432
1   -1.331183
2    0.284169
Name: 2, dtype: float64
0    1.570347
1    0.138292
2    1.656065
Name: 3, dtype: float64

out:

0    None
1    None
2    None
3    None
dtype: object

lambda函数没有指定返回值,所以默认返回None,结果是长度为4全为None的series。

apply函数可以实现非常多的自定义操作,也可以拿来自己实现sum, sort, drop等操作,每次输入的都是n个值,返回1个值最后为series,返回n个值最后则为dataframe。

pandas中的axis是基于numpy的, 所以上面的概念在numpy中也适用。

numpy

其实numpy难的地方在于多维,下面来看一个三维的例子:

import numpy as np
data = np.arange(0, 24).reshape((2,3,4)) #一个2,3,4的ndarray
print(data.shape)
data
(2, 3, 4)

out:

array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])

rollaxis是轴滚动的意思,axis=n,将n轴移到0轴。

data = np.arange(0, 24).reshape((2,3,4))
data = np.rollaxis(data,axis=2) #将2轴移到0轴
print(data.shape)
data
(4, 2, 3)

out:

array([[[ 0,  4,  8],
        [12, 16, 20]],

       [[ 1,  5,  9],
        [13, 17, 21]],

       [[ 2,  6, 10],
        [14, 18, 22]],

       [[ 3,  7, 11],
        [15, 19, 23]]])

将最后一个轴移到最前面,其实就是挨个取最后一层的4个值,组成第一层,内部就是2X3的矩阵。

data = np.arange(0, 24).reshape((2,3,4))
data = np.rollaxis(data,axis=1) 
print(data.shape)
data
(3, 2, 4)

out:

array([[[ 0,  1,  2,  3],
        [12, 13, 14, 15]],

       [[ 4,  5,  6,  7],
        [16, 17, 18, 19]],

       [[ 8,  9, 10, 11],
        [20, 21, 22, 23]]])

将倒数第二个轴移到最前面,其实就是把最后一层4个值当成一个对象进行处理,挨个取第二层3个值,组成第一层,最后内部就是2X4的矩阵。

swapaxes是轴交换的意思,m, n,将m轴与n轴交换。

data = np.arange(0, 24).reshape((2,3,4))
data = np.swapaxes(data,0,1)
print(data.shape)
data
(3, 2, 4)

out:

array([[[ 0,  1,  2,  3],
        [12, 13, 14, 15]],

       [[ 4,  5,  6,  7],
        [16, 17, 18, 19]],

       [[ 8,  9, 10, 11],
        [20, 21, 22, 23]]])

结果为3,2,4,把最后一层4个值当成一个对象,实现的其实就是前面3, 2的转置。

data = np.arange(0, 24).reshape((2,3,4))
data = np.swapaxes(data,0,2)
print(data.shape)
data
(4, 3, 2)

out:

array([[[ 0, 12],
        [ 4, 16],
        [ 8, 20]],

       [[ 1, 13],
        [ 5, 17],
        [ 9, 21]],

       [[ 2, 14],
        [ 6, 18],
        [10, 22]],

       [[ 3, 15],
        [ 7, 19],
        [11, 23]]])

结果为4,3,2,挨个取最后一层4个值,最后一层为第一层每次的2个值。

transpose 转置

data = np.arange(0, 24).reshape((2,3,4))
data = np.transpose(data,(1,2,0))
print(data.shape)
data
(3, 4, 2)

out:

array([[[ 0, 12],
        [ 1, 13],
        [ 2, 14],
        [ 3, 15]],

       [[ 4, 16],
        [ 5, 17],
        [ 6, 18],
        [ 7, 19]],

       [[ 8, 20],
        [ 9, 21],
        [10, 22],
        [11, 23]]])

转置,2,3,4经过1,2,0的取值后为3,4,2,第一层移到最后。

np.newaxis可以强行增加新轴。

data = np.arange(0, 24).reshape((2,3,4))
data = data[:,np.newaxis,:,:]
print(data.shape)
data
(2, 1, 3, 4)

out:

array([[[[ 0,  1,  2,  3],
         [ 4,  5,  6,  7],
         [ 8,  9, 10, 11]]],


       [[[12, 13, 14, 15],
         [16, 17, 18, 19],
         [20, 21, 22, 23]]]])

思考

遇到点有意思的结果,不如大家一起思考一下:

array = np.array([['hello world','sssimon yang']]) 
print(array.shape)
(1, 2)
np.apply_along_axis(lambda a:[i.split(' ')[0] for i in a],axis=0,arr=array)

out:

array([['hello', 'sssim']], dtype='<U5')
np.apply_along_axis(lambda a:[i.split(' ')[0] for i in a],axis=1,arr=array)

out:

array([['hello', 'sssimon']], dtype='<U7')

为什么两次的结果会不一样呢?欢迎在评论区给出你的答案。

感谢大家

原文使用jupyterlab,out为jupyterlab每个cell的默认输出。谢谢大家!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354