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中的顺序一样,都是先找行,再找列。这样的话问题就完美解决啦,当然读者最好根据自己的情况看怎么去理解二维数组,最终就是不要搞混就行。
叮自己还有很多不足的地方,但我也知道我会慢慢进步,反正加油就是啦!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)