第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指定列索引下标(可省略,默认选取所有列)。