pandas索引取数

如题所述

第1个回答  2022-06-30
注:《利用python进行数据分析》的学习笔记-pandas

import pandas as pd

import numpy as np

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

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

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

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

可看作多个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[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指定列索引下标(可省略,默认选取所有列)。
相似回答
大家正在搜