文章目录
Pandas
Pandas 是 Python 中一个非常强大的数据处理库,它提供了快速、灵活和表达式丰富的数据结构,旨在使“关系”或“标签”数据的处理工作变得既简单又直观。Pandas 非常适合于数据清洗和准备阶段,以便进行进一步的分析和建模。
这篇我们接着来介绍Pandas方法:
变量类型的转换
Pandas支持的数据类型:
float、int、string、bool、datetime64[nsr]、datetime64[nsr,tz]、timedelta[ns]、category以及object。
查看各列数据类型
#查看各列数据类型 book_df.dtypes ---------------------- ID int64 name object age int64 gender object clazz object dtype: object
改变数据类型
格式:
df.astype( dtype :指定希望转换的数据类型,可以使用 numpy 或者 python 中的数据类型: int/float/bool/str copy = True :是否生成新的副本,而不是替换原数据框 errors = 'raise' : 转换出错时是否抛出错误, raise/ ignore )
# 改变数据类型 book_df['age'].astype("float") ---------------------------------- 0 22.0 1 24.0 2 22.0 3 24.0 4 22.0 ... 995 24.0 996 21.0 997 22.0 998 23.0 999 23.0 Name: age, Length: 1000, dtype: float64
重置索引
#重置索引--------->reset_index a_pd = pd.DataFrame(np.random.randint(0,10,(3,2)),columns=list('ab'),index=list('efg')) a_pd.reset_index(drop=True) #索引从0开始重置 -------------- a b 0 2 3 1 4 0 2 1 9
删除行
# 删除行 new_a_pd.drop(1,inplace=True) #删除第一行 new_a_pd --------------- a b 0 5 3 2 6 0
索引和切片
series
索引:
data=pd.Series([4,3,25,2,3],index=list('abcde')) data -------- a 4 b 3 c 25 d 2 e 3 dtype: int64 ============================= data['a'] #根据key获取 ------------------- 4 ========================== data[1] #索引获取 -------------- 3 =========================== data[-1] ---------------- 3
切片:
#切片 data['a':'d'] --------------- a 4 b 3 c 25 d 2 dtype: int64 ============================= data[2:4] #索引切片 --------------------- c 25 d 2 dtype: int64 =========================== data[-3:-1] ---------------------- c 25 d 2 dtype: int64 ============================= data[data>3] #获取满足条件的所有行 -------------------- a 4 c 25 dtype: int64
如果索引与行名相同都是1,这时候就不知道是按照哪个来获取,所以获取时候使用loc、iloc:
loc函数:通过行索引 “Index” 中的具体值来取行数据及根据普通索引获取。
iloc函数:通过行号来取行数据,及根据位置索引获取。
data=pd.Series([5,3,2,5,9],index=[1,2,3,4,5]) data.loc[1] #输入名称 ---------------- 5 ==================== data.iloc[1] #输入位置 ------------- 3
DataFrame
取列
当想要获取 df 中某列数据时,只需要在 df 后面的方括号中指明要选择的列即可。如果是一列,则只需要传入一个列名;如果是同时选择多列,则传入多个列名即可(注意:多个列名 用一个 list 存放)。
#获取一列 df[col] #获取多列 df[[col1 , col2]] #输入列名
除了传入具体的列名,我们可以传入具体列的位置,即第几行,对数据进行选取,通过传入位置来获取数据时需要用到 iloc 方法。
df.iloc[行位置,[0,2]]
按行列索引选择
DataFrame对象按照行列检索获取,可以使用loc和iloc函数,方括号中逗号之前的部分表示要获取的行的索引,如果输入一个冒号,或不输入任何数值表示获取所有的行或列,逗号之后方括号表示要获取的列的索引。
1 df.loc[普通行索引,普通列索引] 2 df.iloc[位置行索引,位置列索引]
loc与iloc获取
import numpy as np import pandas as pd data=pd.DataFrame(np.arange(12).reshape(3,4), index=list('abc'),columns=list('ABCD')) #获取行为'b'的行 data.loc['b'] #使用iloc获取,行为'b'的行,行号为1 data.iloc[1]
isin()选择
df.isin(values) 返回结果为相应的位置是否匹配给出的 values
values 为序列:对应每个具体值
values 为字典:对应各个变量名称
values 为数据框:同时对应数值和变量名称
1 df.col.isin([1,3,5]) 2 df[ df.col.isin([1,3,5])] 3 df[ df.col.isin(['val1','val2'])] 4 df[ df.index.isin(['val1','val2'])]
query()的使用
使用boolean值表达式进行筛选
df.query(
expr:语句表达式
inplace=False;是否直接替换原数据框
)
可以使用前缀“@”引用环境变量,等号为==,而不是=。
df.query("col>10 and col<90 and col1=val") ====================== limit = 5 df.query("col<=@limit & col==val") df.query("col<=@limit & col!=val")
排序
用索引排序
df.sort_index(
level :(多重索引时)指定用于排序的级别顺序号/名称18
ascending = True :是否为升序排列,多列时以表形式提供
inplace = False :
na_position = 'last‘ :缺失值的排列顺序 ( first/last)
)
df = pd.read_excel("stu_data.xlsx",index_col=["学号”,”性别”]) df.set_index( ['学号','性别'], inplace = True ) # 通过索引进行排序 df.sort_index() df.sort_index(ascending=False) df.sort_index(ascending = [True,False]) #设置哪个索引进行排序 df.sort_index(level="支出") df.sort_index(level= ["支出","体重"])
使用变量值排序
df.sort_values(
by :指定用于排序的变量名,多列时以列表形式提供
ascending = True :是否为升序排列
inplace = False :
na_position = 'last‘ :缺失值的排列顺序,( first/last)
)
# 根据值进行排序 df.sort_values(by='身高')
修改替换变量值
本质上是如何直接指定单元格的问题,只要能准确定位单元地址,就能够做到准确替换。
# 判断哪一行是我们要的数据 df.体重[1] = 78 df['体重'][1] = 68 df.loc[1,'体重'] = 78 df.开设.isin(['不清楚']) df.开设[df.开设.isin(['不清楚'])] = '可以'
对应数值的替换
df.replace(
to_replace = None :将被替换的原数值,所有严格匹配的数值将被用 value 替换,可以
str/regex/list/dict/Series/numeric/None
value = None :希望填充的新数值
inplace = False
)
df.开设.replace('可以','不清楚',inplace = True) df.性别.replace(['女','男'],[0,1],inplace =True) df.性别.replace({0:'女',1:'男'},inplace =True)
数据分组
df.groupby(
by :用于分组的变量名/函数
level = None :相应的轴存在多重索引时,指定用于分组的级别
as_index = True :在结果中将组标签作为索引
sort = True :结果是否按照分组关键字逬行排序
)#生成的是分组索引标记,而不是新的 df
dfg = df.groupby ('开设') #查看dfg里面的数据 dfg.groups #查看具体描述 dfg.describe( ) #按多列分组 dfg2 = df.groupby(['性别','开设']) dfg2.mean ()
基于拆分进行筛选
筛选出其中一组
dfgroup.get_group()
dfg.get_group ('不必要').mean () dfg.get_group ('不必要').std ()
筛选出所需的列
该操作也适用于希望对不同的变量列进行不同操作时
dfg['身高'].max()
分组汇总
在使用 groupby 完成数据分组后,就可以按照需求进行分组信息汇总,此时可以使用其它专门的汇总命令,如 agg 来完成汇总操作。
使用agg函数进行汇总
df.aggregate( )
名称可以直接简写为 agg,可以用 axis 指定汇总维度,可以直接使用的汇总函数。
dfg.agg( 'count') dfg.agg('median') dfg.agg(['mean', 'median']) dfg.agg(['mean', 'median']) #引用非内置函数 import numpy as np df2.身高.agg (np. sum) dfg.身高.agg (np. sum)
引用自定义函数
def mynum(x:int) ->int: return x.min() df2.身高.agg (mymean) dfg.agg(mymean)
处理缺失值
认识缺失值
系统默认的缺失值 None 和 np. nan。
data=pd.Series([3,4,np.nan,1,5,None]) df=pd.DataFrame([[1,2,None],[4,np.nan,6],[5,6,7]])
缺失值查看
直接调用info()方法就会返回每一列的缺失情况。
df=pd.DataFrame([[1,2,np.nan],[4,np.nan,6],[5,6,7]]) df.info()
获取所有缺失值
Pandas中缺失值用NaN表示,从用info()方法的结果来看,索引1这一列是1 2 non-null float64,表示这一列有2个非空值,而应该是3个非空值,说明这一列有1个空值。还可以用isnull()方法来判断哪个值是缺失值,如果是缺失值则返回True,如果不是缺失值返回False。df.isna(): 检查相应的数据是否为缺失值同 df.isnull().
df.notna()等同于notnull()
data=pd.Series([3,4,np.nan,1,5,None])print('isnull()方法判断是否是缺值:') print(data.isnull()) print(data.isna()) print('获取缺值:') print(data[data.isnull()]) print('获取非空值') print(data[data.notnull()])
填充缺失值
调用fillna()方法对数据表中的所有缺失值进行填充,在fillna()方法中输入要填充的值。还可以通过method参数使用前一个数和后一个数来进行填充。
df.fillna( value :用于填充缺失值的数值,也可以提供dict/Series/DataFrame 以进—步指明哪些索引/列会被替换不能使用 list method = None :有索引时具体的填充方法,向前填充,向后填充等 limit = None :指定了 method 后设定具体的最大填充步长,此步长不能填充 axis : index (0), columns (1) inplace = False )
Series对象缺失值填充:
data=pd.Series([3,4,np.nan,1,5,None]) print('以0进行填充:') print(data.fillna(0)) print('以前一个数进行填充:') print(data.fillna(method='ffill')) print('以后一个数进行填充:') print(data.fillna(method='bfill')) print('先按前一个,再按后一个') print(data.fillna(method='bfill').fillna(meth od='ffill'))
DataFrame对象缺失值填充:
df=pd.DataFrame([[1,2,np.nan],[4,np.nan,6],[5,6,7]]) print('使用数值0来填充:') print(df.fillna(0)) print('使用行的前一个数来填充:') print(df.fillna(method='ffill')) print('使用列的后一个数来填充:') print(df.fillna(method='bfill' ,axis=1))
列的平均值来填充:
df=pd.DataFrame([[1,2,np.nan],[4,np.nan,6],[5,6,7]]) for i in df.columns: df[i]=df[i].fillna(np.nanmean(df[i])) df
数据查重
标识出重复的行
标识出重复行的意义在于进一步检査重复原因,以便将可能的错误数据加以修改:
df['dup' ] = df.duplicated( ['课程','开设'])
利用索引进行重复行标识df.index.duplicated() df2 = df.set_index ( ['课程','开设'] ) df2.index.duplicated ()
直接删除重复的行
drop_duplicates ( subset=“ ”按照指定的行逬行去重 keep='first' 、 'last' 、 False 是否直接删除有重复的所有记录 )
df. drop_duplicates ( ['课程', '开设' ] ) df. drop_duplicates ( ['课程', '开设' ] , keep = False )
利用査重标识结果直接删除:
#df[~df.duplicated( )] df[~df . duplicated ( ['课程', '开设' ] )]
总结
本篇介绍了,pandas中常用的一些数据处理方法,结合上一篇,常用方法就介绍完了哦,务必好好整理!