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')

常用读取CSV以及excel:

#文本文件,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

DataFrame的增删改查

查看DF状态:

df.values  # 查看所有元素
df.index   # 查看索引
df.columns # 查看所有列名
df.dtype   # 查看字段类型
df.size    # 元素总数
df.ndim    # 表的维度数
df.shape   # 返回表的行数与列数
df.info    # DataFrame的详细内容
df.T       # 表转置

查看属性(切片操作):

df['col1'] #单列数据
df['col1'][2:7] #单列多行
df[['col1','col2']][2:7] # 多列多行
df[:][2:7] #多行数据
df.head() #前几行 
df.tail() #后几行

# 切片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]]

更改某个字段的数据

df.loc[df['col1']=='258','col1']=214
# 注意:数据更改的操作无法撤销,建议开始时对数据就行拷贝

增加一列数据

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

删除数据:

# 删除某几行数据,inplace为True时在源数据上删除,False时需要新增数据集
df.drop(labels=range(1,11),axis=0,inplace=True)
# 删除某几列数据
df.drop(labels=['col1','col2'],axis=1,inplace=True)

1.删除/选取某列含有特殊数值的行

#df1=df1[df1['col'].isin([1])]
#df1[df1['col'].isin([1])]  选取df1中col列包含数字1的行
df1=df1[~df1['col'].isin([1])]
#通过~取反,选取不包含数字1的行



2.删除/选取某行含有特殊数值的列

#删除/选取某行含有特定数值的列
## iat类似于iloc使用隐式索引访问某个元素
cols=[x for i,x in enumerate(df1.columns) if df1.iat[0,i]==1]
#利用enumerate对row0进行遍历,将含有数字1的列放入cols中
df1=df1.drop(cols,axis=1) #利用drop方法将含有特定数值的列删除

3.删除满足条件元素所在的行

#单条件删除
df_clear = df1.drop(df1[df1['x']<0.01].index)
# 也可以使用多个条件
df_clear = df1.drop(df1[(df1['x']<0.01) | (df1['x']>10)].index) #删除x小于0.01或大于10的行

DataFrame数据的描述分析

#数值型:
df[['col1','col2']].describe()
#类别型:
df['col1'].value_counts()[0:10]
#category型:
df['col1'] = df['col1'].astype('category')
df['col1'].describe()

处理时间序列数据

# 转换字符串时间为标准时间:
df['time'] = pd.to_datetime(df['time'])
# 提取时间序列信息
year = df['time'].year()
# year-年,month-月,day-天,hour-小时,minute-分钟,second-秒,date-日期,time-时间 week-一年中第几周,quarter-季节,dayofweek-一周中第几天,weekday_name-星期名称
# 加减时间:
# 使用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()

使用分组聚合

使用groupby拆分数据并计算

by–分组的字段 level–标签所在级别,默认None as_index–聚合标签是否以df形式输出,
默认True,sort–是否对分组依据,分组标签进行排序,默认True group_keys–是否显示分组
标签名称,默认True squeeze–是否对返回数据进行降维,默认False
聚合函数有count,head,max,min,median,size,std,sum

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

使用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()))

合并数据

当axis=1时,concat作行合并,join参数为inner(交集)和outer(并集),默认为outer ignore_index,keys,levels,names,verify_integrity这几个参数不常用,设为默认即可

横向合并数据:

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

纵向合并数据:

# 使用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)

主键合并数据(表联接)

使用merge合并:

left_on为表1的主键,right为表2的主键,left_index为是否将表1的index作为主键,默认False
sort为是否根据连接键对合并后的数据进行排序,默认False,suffixes为合并后数据列名相同的
后缀,默认(’_x’,’_y’)。

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

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

df1.join(df2,on=None,how='inner',lsuffix='',rsuffix='',sort=None)
# lsuffix为合并后左侧重叠列名的后缀,rsuffix为合并后右侧重叠列名的后缀
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ACxz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值