pandas索引取数

2020-05-07  本文已影响0人  9fbe1619f5ab

注:《利用python进行数据分析》的学习笔记-pandas

import pandas as pd

import numpy as np

Series

一维数组,包含一个数组对象,一个索引对象,索引对象默认为0开始的递增数字,可通过index=[idx1, idx2, ...]参数指定

可通过索引选取/修改相应的数据,选取:data=series[idx], 修改:series[[idxm, idxn, ...]]=[dm, dn, ...]

series可看成定长有序字典,索引到数据的映射,series可用于字典参数的函数中。idxn in series返回True/False

多个series做算术操作,会自动对齐不同索引的数据,无此数据自动填充NaN

DataFrame

可看作多个series组成的表单,dataframe有两种索引,与series相同的index行索引,还有columns列索引

选取/修改一行数据    dataframe.loc['index']

选取/修改一列数据    dataframe['column'], dataframe.column

重新索引

obj.reindex(newIndex)                                                                                                    #适用于series与dataframe

obj.reindex(index=newIndex, columns=newcolumns)                                                    #dataframe需对行索引列索引都重新索引时

obj.reindex(index=newindex, columns=newcolumns, fill_value=100)                            #指定填充值,不指定时填充NaN

obj.reindex(index=newindex, columns=newcolumns, fill_value=100, method='ffill')      #指定填充方法ffill/pad(前向填充),bfill/backfill(后向填充)

丢弃行/列数据

obj=obj.drop(index, axis=0)

obj=obj.drop([col1, col2, ...], axis=1)

axis默认为0,删除列数据时指定axis为1

索引/选取/过滤

series

obj = pd.Series(range(5), index=list('abcde'))

取单数            obj[2],      obj['c']

切片取数        obj[2:5],    obj['a':'c']

不连续取数    obj[1,3],    obj['a','c','d']

过滤               obj[obj>2],

修改               obj[3]=0,

注:series切片不用于python数据结构的切片,series的切片包含末端,即python:[start, end), series:[start, end]

dataframe

obj = pd.DataFrame(np.arange(15).reshape((3,5)),

                        index = ['one', 'two', 'three'],

                        columns = list('abcde') )

取单列             obj.loc[:, 'c'],                             obj.iloc[:, 2],                            obj.xs('c', axis=1),                       obj['c'], 

取单行             obj.loc['one'],                            obj.iloc[1],                               obj.xs('one', axis=0), 

取连续行         obj.loc['one':'three'],                  obj.iloc[1:3],                obj[:2], 

取连续列         obj.loc[:, 'b':'d'],                         obj.iloc[:, 2:4],

取不连续行     obj.loc[['one','three']]                 obj.iloc[[0,2]],

取不连续列     obj.loc[:, ['b', 'e']]                       obj.iloc[:, [1,4]],

取单行单列     obj.loc['two', 'd']                         obj.iloc[2, 4]

取连续行列     obj.loc['one':'three', 'b':'d']          obj.iloc[:2, 2:4]

取不连续行列  obj.loc[['one','three'], ['b':'d']]     obj.iloc[[0,2], [1,4]]

根据列值过滤行      obj.loc[obj['c']%2==0, :]      

******此处吐个槽,这个切片方法一会儿只能取单列,一会儿只能取连续行,一会儿包含终止项,一会儿不包含,我人都傻了...

******loc/iloc方法接收两个参数,第一个是行,第二个是列,都可切片,也都可指定索引,列参数可以不写,默认取所有列数据

******下面总结下这个花哨的切片!

dataframe有两种索引,行索引/列索引。每种索引包含两类用法,索引名称(对应df.loc)/索引下标对应(df.iloc)

>>>  df = pd.DataFrame(np.arange(25).reshape((5,5)),

                           index=['line'+str(i) for i in range(1,6)],

                           columns=['column'+str(i) for i in range(1,6)])

>>> df

            column1     column2      column3      column4      column5

line1             0              1                 2                 3                 4

line2             5              6                  7                 8                9

line3             10            11               12               13              14

line4             15            16              17                18               19

line5             20             21              22                23              24

>>>df['column4']                                     # 指定列名取列数据                  

line1      3

line2      8

line3    13

line4    18

line5    23

Name: column4,    dtype: int32

>>> df[2:4]                                              # 按行索引下标取连续多行数据

            column1   column2   column3   column4   column5

 line3         10             11             12           13             14

 line4         15             16             17           18             19

>>> df['line2': 'line4']                               # 按行索引名称取连续多行数据                            

            column1   column2   column3   column4   column5

line2          5               6               7              8              9

 line3         10             11             12           13             14 

 line4         15             16             17           18             19 

>>> df.loc['line2':'line4']                        #     连续行,切片的起始点与终止点都包含在内,同 df[1:4] 

>>> df.iloc[2:4]                                     #     连续行,切片只包含起始点,不包含终止点

>>> df.loc[:, 'column3':'column4']         #     连续列,切片的起始点与终止点都包含在内

>>> df.iloc[:, 2:4]                                  #     连续列, 切片只包含起始点,不包含终止点

>>> df.loc[['line2','line1','line5'], ['column3','column5']]        #     不连续行列,指定哪项取哪项

>>> df.iloc[[2, 1, 4, 0], [3, 1, 3]]                                           #     同上

总结

①    df[columnName]                                             取单列数据,只能用列名,不能使用列下标,不能用于取单行

②    df[lineName1: lineName2]                              取连续行数据,使用行名时,包含末尾项,即[start,end]

③    df[lineIndex1: lineIndex2]                                取连续行数据,使用行下标时,不包含末尾项 ,即[start,end)

④    df.loc['line2':'line4']                                          取连续行数据,使用行名时,包含末尾项,即[start,end]      

⑤    df.iloc[2:4]                                                       取连续行数据,使用行下标时,不包含末尾项 ,即[start,end) 

⑥    df.loc[:, columnName1:columnName2]          取连续列,使用列名时,包含末尾项,即[start,end]    

⑦    df.iloc[:, columnIndex1:columnIndex2]           取连续列,使用列下标时,不包含末尾项,即[start,end)

⑧    df.loc[[lineName1, ...], [columnName1, ...]]    使用行名/列名取不连续行列

⑨    df.iloc[[lineIndex1, ...], [columnIndex1, ...]]     使用行下标/列下标取不连续行列

以前用的时候总觉得奇奇怪怪的,花了一下午时间一个一个尝试终于捋顺了,欧耶! (〃 ̄︶ ̄) 人 ( ̄︶ ̄〃)

DataFrame直接切片,即df[args],可用于指定列名取单列数据,可用于指定行名/行下标取连续多行数据

                                                        取单行数据不可直接切片,需使用loc/iloc方法

DataFrame.loc(line, column)    用于按索引名称取行/列数据,此时,首尾项都会被取出

                                                 参数line指定行索引名称,参数2指定列索引名称(可省略,默认选取所有列)。

DataFrame.iloc(line, column)   用于按索引下标取行/列数据,此时,尾项数据不会被取出

                                                 参数line指定行索引下标,参数2指定列索引下标(可省略,默认选取所有列)。

上一篇 下一篇

猜你喜欢

热点阅读