python DataFrame中对行、列处理顺序的细节解析,经常搞混的可不要错过啦

python DataFrame中对行、列处理顺序的细节解析,经常搞混的可不要错过啦,第1张

python DataFrame中对行、列处理顺序的细节解析,经常搞混的可不要错过啦

python中处理和分析数据几乎离不开pandas包中的Dataframe,而其中的有些用法我一直很容易弄混,主要是对行和列的处理的顺序,以及axis处理方向的理解。因此现在写下此文,以加深自己的记忆,也希望能帮助到有需要的人。

文章目录
  • 行与列
    • 取列、取行、取值
    • axis
  • numpy或者其它二维数组的“行”、“列”


行与列 取列、取行、取值

首先是较简单的取值,取值这里可以分为取列,取行,以及取某些区域或者某特定位置的值,直接通过简单的例子进行介绍吧,由于本文主要是区分列和行处理时容易混淆的地方,所以很多具体的方法我就不多赘述了。

>>> import numpy as np
>>> import pandas as pd
>>> data = pd.Dataframe(np.arange(16).reshape(4,4),index=list('abcd'),columns=list('wxyz'))
>>> data
    w   x   y   z
a   0   1   2   3
b   4   5   6   7
c   8   9  10  11
d  12  13  14  15
# 取列
>>> data['x']
>>> data.x
>>> data[['x','z']]
>>> data.loc[:,'x']
>>> data.iloc[:,1]
>>> data.iloc[:,1:2]
>>> data.iloc[:,1:3]
>>> data.loc[:,'x':'z']
# 取行
>>> data[0:2]  # data[0]会报错,会默认认为是列
>>> data['a':'c'] # data['a']会报错,会默认认为是列
>>> data.loc['a']
>>> data.iloc[2]
>>> data.iloc[1:3]
>>> data.loc['b':'d']
# 取值
>>> data.loc['d','y']
>>> data.iat[2,3]
>>> data.loc['c',['y','z']]

取列、取行、取值的方法大致有上述这一些,可以看出取列的方法较多,取的时候较简单,直接表名后跟列名即可,这也符合我们的日常习惯(经常需要对列进行处理)。

在需要取行时就相对麻烦一点,不能直接使用表名加要取的某一行,而是必须使用冒号进行对行的切片才表明是对行处理(也就是不能使用data[‘x’:‘z’]取列,而只能取行),否则只能使用.loc或者.iloc这种函数来帮助了。

在使用.loc,.iloc这样的定位方法时,就需要将要取列的列名或列的索引(不要和表的索引搞混了)放在方括号中逗号的后面,前面则是用来放所需取用的行索引的(如果为:表示取所有行)。

OK,总结一圈后,告诉了我们一个结论就是pandas Dataframe在获取一个二元列表如[‘m’,‘n’]时,是先将第一位当做行,第二位当做列的。其它情况下若是直接输入想处理的列名(如data[‘x’])则表示处理列,还有其它的类似的情况我就不多赘述了。之后希望不要再搞混这些情况啦!

axis

首先,是Dataframe中的行与列的确定,在Dataframe中默认是先处理行再处理列的,因此默认的axis=0表示为对行的处理,但是要注意的是这里的对行处理并不是对每一行进行一次 *** 作,我们看个例子:

# 以下含有>>>符号表示是输入的命令,其余的是输出
>>> import numpy as np
>>> import pandas as pd
>>> data = pd.Dataframe(np.arange(16).reshape(4,4),index=list('abcd'),columns=list('wxyz'))
>>> data  # data本身
    w   x   y   z
a   0   1   2   3
b   4   5   6   7
c   8   9  10  11
d  12  13  14  15
>>> data.sum() # 默认axis=0
w    24
x    28
y    32
z    36
dtype: int64
>>> data.sum(axis=1)    # 调到对列的处理
a     6
b    22
c    38
d    54
dtype: int64

从上面的两个结果来看,axis=0的情况下计算的是每一列的总和,而axis=1计算的是每一行的总和,因此我们能总结出,axis=0并不代表是对每一行进行处理,而是跨行进行数据处理,axis=1则是跨列进行数据处理。以后可要记清楚不要搞混啦!

numpy或者其它二维数组的“行”、“列”

其实理解本质的话就知道二维数组并不是实打实的行或列,因为它们实际上只是多项列表或者series的合并形式而已,但是我昨天就被这个搞混淆了一次,所以也要记录下来,希望之后不会再犯错。

由于numpy array和普通的array都差不多,我就不说两次啦,就写一种情况就好了。

>>> import numpy as np
>>> array = np.arange(25).reshape((5, 5))
>>> array
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, 24]])

其实就是列表的嵌套嘛,所以比如使用array[1]那就是先取到[ 5, 6, 7, 8, 9]这个列表呗,再加一个额外的下标,不就是在[ 5, 6, 7, 8, 9]这个列表里面取值吗,比如array[1][1]就是取[ 5, 6, 7, 8, 9]列表里面的第二个元素嘛,所以结果就是6呗。

如果和行列结合起来其实也是可以的,观察这个二维数组的排布,其实[ 5, 6, 7, 8, 9]就是第二行嘛,而6所在的位置也就是第二列而已,和Dataframe中的顺序一样,都是先找行,再找列。这样的话问题就完美解决啦,当然读者最好根据自己的情况看怎么去理解二维数组,最终就是不要搞混就行。

自己还有很多不足的地方,但我也知道我会慢慢进步,反正加油就是啦!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4830136.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-10
下一篇 2022-11-10

发表评论

登录后才能评论

评论列表(0条)

保存