python 函数总结_Python笔记--Pandas常用函数汇总

【pandas统计分析】读取数据

数据库数据读取/存储:

import pymysql

from sqlalchemy import create_engine

conn = create_engine('mysql+pymysql://root:123456@localhost:3306/databasename?charset=utf8')

sql = 'select * from tb_name'

df = pd.read_sql(sql=sql,con=con,index_col=True,coerce_float=True,columns=True)

或者:

df = pd.read_sql_table(tablename,con=con,index_col=True,coerce_float=True,columns=True)

# sql--查询语句 ,con--数据库连接信息(地址,用户名,密码,数据库名称)

index_col--设定的列作为行名,默认为None ,coerce_float--将数据库中的decimal的数据

转换为pandas里的float64类型,默认为True ,columns--读取数据的列名,默认为None

将表存入mysql:

pd.io.sql.to_sql(df,tablename,con=con,if_exists='fail')

# if_exists的参数有fail(如果表存在,则不写入),replace(代替原来的表),append(在原来的表上

追加数据)

文本文件,csv文件读取/存储:

pd.read_table(filepath,sep='/t',header='infer',names=None,index_col=None,

dtype=None,encoding='utf-8',nrows=None)

pd.read_csv(filepath,sep=',',header='infer',names=None,index_col=None,

dtype=None,encoding='utf-8',nrows=None)

# header--将某行数据作为列名,默认infer,表示自动识别 names--接受array,自定义列名

nrows表示读取前n行,默认为None

df.to_csv(path_or_buf,sep=',',na_rep='',columns=None,header=True,index=True,

index_label=None,mode='w',encoding='utf-8')

# path_or_buf--存储的路径 na_rep--代表缺失值 columns--写出的列名 header--是否将列名

写出 mode--数据写入模式,默认‘w’

excel文件读取/存储

pd.read_excel(filepath,sheetname='',header='infer',names=None,index_col=None,

dtype=None)

# sheetname--接受string,int,数据表的位置,默认0 header--将某行作为列名,默认infer

names--接受array,自定义列名

df.to_excel(excel_writer,sheetname='',na_rep='',header=True,index=True,

index_label=None,mode='w',encoding='utf-8')

# excel_writer--存储文件路径 sheetname--sheet表名,默认sheet1

2. DataFrame的增删改查

2.1 查看DataFrame:

df.values # 查看所有元素

df.index # 查看索引

df.columns # 查看所有列名

df.dtype # 查看字段类型

df.size # 元素总数

df.ndim # 表的维度数

df.shape # 返回表的行数与列数

df.info # DataFrame的详细内容

df.T # 表转置

2.2 查看访问DataFrame中的数据

2.2.1 基本查看方式:

单列数据:df['col1']

单列多行:df['col1'][2:7]

多列多行:df[['col1','col2']][2:7]

多行数据:df[:][2:7]

前几行: df.head()

后几行: df.tail()

2.2.2 loc,iloc的查看方式(大多数时候建议用loc)

# loc[行索引名称或条件,列索引名称]

# iloc[行索引位置,列索引位置]

单列切片:df.loc[:,'col1']

df.iloc[:,3]

多列切片:df.loc[:,['col1','col2']]

df.iloc[:,[1,3]]

花式切片:df.loc[2:5,['col1','col2']]

df.iloc[2:5,[1,3]]

条件切片:df.loc[df['col1']=='245',['col1','col2']]

df.iloc[(df['col1']=='245').values,[1,5]]

2.3 更改某个字段的数据:

df.loc[df['col1']=='258','col1']=214

# 注意:数据更改的操作无法撤销,更改前最好对条件进行确认或者备份数据

2.4 增加一列数据:

df['col2'] = 计算公式/常量

2.5 删除数据:

# 删除某几行数据,inplace为True时在源数据上删除,False时需要新增数据集

df.drop(labels=range(1,11),axis=0,inplace=True)

# 删除某几列数据

df.drop(labels=['col1','col2'],axis=1,inplace=True)

3. DataFrame的描述分析

#数值型:

df[['col1','col2']].describe()

#类别型:

df['col1'].value_counts()[0:10]

#category型:

df['col1'] = df['col1'].astype('category')

df['col1'].describe()

4. 处理时间序列数据

4.1 转换字符串时间为标准时间:

df['time'] = pd.to_datetime(df['time'])

4.2 提取时间序列信息

year = df['time'].year()

# year-年,month-月,day-天,hour-小时,minute-分钟,second-秒,date-日期,time-时间

week-一年中第几周,quarter-季节,dayofweek-一周中第几天,weekday_name-星期名称

4.3 加减时间:

# 使用Timedelta,支持weeks,days,hours,minutes,seconds,但不支持月和年

df['time'] = df['time'] + pd.Timedelta(days=1)

df['time'] = df['time'] - pd.to_datetime('2016-1-1')

# 时间跨度计算:

df['time'].max() - df['time'].min()

5. 使用分组聚合

5.1 使用groupby拆分数据并计算:

df.groupby(by='',axis=0,level=None,as_index=True,sort=True,group_keys=True

,squeeze=False).count()

# by--分组的字段 level--标签所在级别,默认None as_index--聚合标签是否以df形式输出,

默认True,sort--是否对分组依据,分组标签进行排序,默认True group_keys--是否显示分组

标签名称,默认True squeeze--是否对返回数据进行降维,默认False

# 聚合函数有count,head,max,min,median,size,std,sum

5.2 使用agg聚合数据:

# 求出当前数据的统计量

df[['col1','col2']].agg([np.mean,np.sum])

# 分别求字段的不同统计量

df.agg({'col1':np.sum,'col2':np.mean})

# 求不同字段不同数目的统计量

df.agg({'col1':np.sum,'col2':[np.mean,np.sum]})

5.3 使用transform聚合数据:

# 实现组内数据离差标准化

dfgroup.transform(lambda x:(x.mean()-x.min())/(x.max()-x,min()))

6.创建透视表与交叉表

6.1使用pivot_table创建透视表

pd.pivot_table(data,index='',columns='',values='',aggfunc='mean',

fill_value=None,margins=True,dropna=False)

# data为表,index为行分组键,columns为列分组键,values为要聚合的字段,aggfunc为聚合

函数,默认为mean,fill_value为指定填充缺失值,margins为是否显示汇总,默认为True

dropna为是否删除全部为NaN的列,默认False

6.2使用crosstab创建交叉表

dfcross = pd.pivot_table(index=df['col1'],columns=df['col2'],values=df['col3'],

aggfunc='mean',colnames=None,rownames=None,margins=True,dropna=False,

normalize=False)

# colnames表示列分组键名,无默认 rownames表示行分组键名,无默认

normalize表示是否对数据进行标准化,默认False

【数据预处理】

1.合并数据

1.1 横向合并数据:

pd.concat([df1,df2,df3],axis=1,join='inner',ignore_index=False,keys=None,

levels=None,names=None,verify_integrity=False)

# 当axis=1时,concat作行合并,join参数为inner(交集)和outer(并集),默认为outer

ignore_index,keys,levels,names,verify_integrity这几个参数不常用,设为默认即可

1.2 纵向合并数据

# 使用concat合并

pd.concat([df1,df2,df3],axis=0,join='inner',ignore_index=False,keys=None,

levels=None,names=None,verify_integrity=False)

# 使用append合并,前提条件是两张表的列名需完全一致

df1.append(df2,ignore_index=False,verify_integrity=False)

1.3 主键合并数据(表联接)

# 使用merge合并:

pd.merge(left,right,how='inner',on=None,left_on=None,right_on=None,

left_index=False,right_index=False,sort=False,

suffixes=('_x','_y'),copy=True,indicator=False)

# left和right为联接的表1和表2,how为联接的方式(inner,outer,right,left),默认inner

left_on为表1的主键,right为表2的主键,left_index为是否将表1的index作为主键,默认False

sort为是否根据连接键对合并后的数据进行排序,默认False,suffixes为合并后数据列名相同的

后缀,默认('_x','_y')。

# 使用join进行合并,前提是俩张表的主键的名字必须相同

df1.join(df2,on=None,how='inner',lsuffix='',rsuffix='',sort=None)

# lsuffix为合并后左侧重叠列名的后缀,rsuffix为合并后右侧重叠列名的后缀

1.4 重叠合并数据:

俩张表的内容几乎一致,但某些特征在一张表上是完整的,但在另外一张表上是缺失的

df1.combine_first(df2)

2. 清洗数据(重复值,缺失值,异常值)的处理:

2.1重复值的检测及处理:

# 判断某个字段是否有重复值

len(df.col1.unique()) #将返回值与len(df.col1)进行比较

# 记录重复处理:

df.drop_duplicates(subset=['col1','col2'],keep='first',inplace=False)

# subset为需要去重复的列,keep参数有first(保留第一个),last(保留最后一个),

false(只要有重复都不保留) inplace为是否在源数据上操作,默认False

2.2 缺失值的检测及处理

# 判断字段是否有缺失

df.isnull().sum() 或 df.notnull().sum()

# 缺失值处理--删除:

df.dropna(axis=1,how='any',inplace=False)

# axis为1是删除列,为0时删除行 how参数为any(只要有缺失值存在就删除),all(全部为缺失值

时才删除,默认为any inplace为是否在源数据上操作,默认为False

# 缺失值处理--替换法

# 替换数值型字段时,常用平均数,中位数,替换类别性字段时,常用众数

df.fillna(value=None,method=None,axis=1,inplace=False,limit=None)

# method参数为ffill(用上一个非缺失值填充),bfill(用下一个非缺失值来填充)

# 缺失值处理--插值法

# 线性插值:

from scipy.interpolate import interplt

x=np.array(df['col1'])

y=np.array(df['col2'])

linearInsValue = interplt(x,y,kind='linear')

linearInsValue([6,7])

# 拉格朗日插值:

from scipy.interpolate import lagrange

x=np.array(df['col1'])

y=np.array(df['col2'])

largeInsValue = lagrange(x,y)

largeInsValue([6,7])

# 样条插值:

from scipy.interpolate import spline

x=np.array(df['col1'])

y=np.array(df['col2'])

splineInsValue = spline(x,y,xnew=np.array([6,7]))

# 线性插值法需要x与y存在线性关系,效果才好,大多数情况下,用拉格朗日法和样条插值法较好

2.3 异常值的检测及处理

# 使用3σ原则识别异常值,不过该原则只对正态分布或近似正态分布的数据有效

def outRange(ser1):

boolInd = (ser1.mean()-3*ser1.std()>ser1)|(ser1.mean()+3*ser1.std()

index = np.arange(ser1.shape[0])[boolInd]

outRange = ser1.iloc[index]

return outRange

outlier = outRange(df['col1'])

len(outlier)

# 用箱线图来分析异常值

import matplotlib.pyplot as plt

plt.figure(figsize=(10,7))

p = plt.boxplot(df['col1'].values,notch=True)

outlier = p['fliers'][0].get_ydata()

plt.show()

len(outlier)

3. 数据标准化

3.1 离差标准化数据(区间缩放)

# 自定义离差标准化函数

def MinMaxScale(data):

data = (data-data.min())/(data-data.max())

return data

df['col1_scale'] = MinMaxScale(df['col1'])

3.2 标准差标准化数据

# 自定义标准差标准化函数

def StandardScale(data):

data = (data-data.mean())/data.std()

return data

df['col1_scale'] = StandardScale(df['col1'])

3.3 小数定标标准化数据:通过移动数据的小数位数,将数据映射到区间【-1,1】

# 自定义小数定标标准化数据

def DecimalScale(data):

data = data/10**np.ceil(np.log10(data.abs().max()))

return data

df['col1_scale'] = DecimalScale(df['col1'])

离差标准化缺点为若数据集中某个数据值很大,则离差标准化的值就会趋近于0,并且相互之间差别不大。但方法简单,便于理解。标准差标准化受数据分布的影响较小,小数定标标准化的适用范围更广。

4.数据的转换

4.1 哑变量处理

pd.get_dummies(data,prefix=None,prefix_sep='_',dummmy_na=False,columns=None)

# prefix为哑变量后列名的前缀,默认为None dummy_na为是否需要为NaN值添加一列,默认None

columns默认为None,表示对所有的object和category类型的字段进行处理

4.2 连续型数据离散化(分箱处理)

# 等宽法:对数据分布要求较高,若数据分布非常不均匀,这种方法不合适

pd.cut(df['col1'],bins=5,labels='',precision=3)

# bins为离散化后的类别数目,labels为离散化后各个类别的名称,默认为空 precision是标签精度

默认为3

# 等频法:

def SameRateCut(data,k):

w = data.quantile(np.arange(0,1+1.0/k,1.0/k))

data = pd.cut(data,w)

return data

result = SameRateCut(df['col1'],5).value_counts()

关于作者:

本人就职于某金融科技公司从事风控建模工作,欢迎交流。

对于风控和机器学习感兴趣的童鞋可以关注下我的公众号:风控汪的数据分析之路。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值