数据分析训练营-pandas

import pandas as pd
#创建列
ser=pd.Series('张三','李四','王五',list(range(1,4)))
#取值
ser[2]

ind=[1,3]
ser[ind]#取索引为1和3的
ser.values#取值
type(ser.values)#ndarray     

ser2=pd.Series(18,19,17,list(range(1,4)))
ser2+1#每一行的数据都+1         

ser2{ser2%2==0]#筛选取余
data={'beijing':9000,'shanghai':8500,'guangzhou':7400}
ser3=pd.Series(data)#索引变成了字符串beijing等
ser3['beijing']#通过索引找值
'beijing' in ser3 #判断索引是否在返回True
ser3.to_dict()#转化为字典
ser3.tolist()
ser3.tojson()
ser3to_frame()

DataFrame
import numpy as np
data=np.arrange(100,109).reshape(3,-1)
df=pd.DataFrame(data)#生成数据表
data={'name':['jack','mary','lily'],'age':[19,19,17],'height':[1.68,1.37,1.62]}
df=pd.DataFrame(data)#字典键做为表头列名
df.columns#查看列名

df=pd.DataFrame(data,columns=['name','age','height','email'],index=range(14))#加一个空列,设置索引值

数据选取操作
data={'name':['张三','李四','王五','赵六'],'age':[19,19,2017],'height':[1.68,1.37,1.621.80]}
df=pd.DataFrame(data,columns=['name','age','height','email'])
df['name']#查询名字这一列
df.age
df[['name']]#再套一个中括号可以把查询的这一列变成表
df[['name','age']]#两列值的dataframe

names=df.name
names[0]='jack'#实际上df会被修改。张三被改成jack

复制旧表,对新表进行操作
names=df.name.copy()
name[0]='周八'
df.columns#获取列的索引
df.columns[1:3]#Index(['age','height'],dtype='object')

加一列出生年月year
import datetime
df['year']=datetime.datetime.now().year -df.age #新增列出生年月

删除列主表不受影响
df.drop('year',axis=1)
df.drop(['year','height'],axis=1)
df.drop(df.columns[1::2],axis=1)#隔一列删除一列

loc定位
df.loc[1]#输出李四这一列
df.loc[[1]]#变成dataframe的表
不知道索引值,要最后两个数的name和age
df.index[-2:]
df.loc(df.index[-2:])#所有列
df.loc(df.index[-2:],['name','age'])

df.shape #查看维度(4,4)
df.loc[df.shape[0]]={'age':18,'name':'吴九','height':1.66,'year':0} #在最后一行插入数据

df2=df.drop(2)# 删除索引为2的行
df2.index=range(df2.shape[0])#重置索引

iloc与loc的区别
iloc是物理索引,存在内存里不能改变,loc是可以人为改变
df2.loc[2]
df.iloc[2]
df2.index=list('ABCD')#修改索引
df.iloc[1:3]#切片取数据
df.iat[1,1]#通过坐标轴取数据,第一行第一列的数据

通过比较运算符筛选数据
df2['height']>=1.65#返回True或者False
df2[df2['height']>=1.65]#取出大于等于1.65的数据
df2[(df2['height']>=1.65)&(df2['age']<=20)]#同时满足两个条件
query方法
df.quary('height>1.65 and age<=20')
age=20
df.query('age<@age')#age是变量,@引进变量
isin
df['age'].isin([18,19])#是否有某些数据 isin是否有18或者19岁的,返回TF
df[df['age'].isin([18,19])]#取出符合条件的数据

矩阵转置
X.T #行变列,列变行

## Pandas导入数据

pd.read_table(./01.txt)
pd.read_table(./02.txt)#tab键自动识别隔开
pd.read_table(./03.txt,sep=':',header=None,names=['name','pwd','uid','gid','local','home','shell'])
#原文件分隔符为:,设置sep=':'。header是指表头不用txt的数据。names指定表头

CSV一般列与列之间用逗号分隔
pd.read_csv(./04.csv)

excel
pip3 install xlrd#安装第三方模块
pd.read_excel(./05.xlsx)

html
pip3 intall xlml#安装
tables=pd.read_html('./06.html',header=0) #只会读取table的值,把表头设置在0的位置
tabless[0]#一共有两张表,取出第一张
tables=pd.read_html('./06.html',header=0,attrs={'class':'mydata'}) #取出class为mydata的元素

mysql
pip3 install pymysql#安装第三方软件
con=pymysql.connect(host='localhost',username='root',password='123456',database='doubandb',charset='utf8',use_unicode=True)
#链接数据库
sql_cmd='select * from books2' #写sql命令
df=pd.read_sql(sql_cmd,con) #按照命令读取表的内容
df.head(2) #显示前两行

sort
st=pd.Series(list('CAD'),index=3,1,2) #生成序列
st.sort_index()#通过索引进行排序
st.sort_values()#通过值进行排序
st.sort_values(ascending=False)#通过值进行倒序排序

arr=[[9,4,8],
     [4,6,5],
     [4,5,3]]#初始化一个数组
df=pd.DataFrame(arr,index=[0,2,1],columns='cab')#把数组变成表,设置索引列名
df.sort_index()
df.sort_index(axis=1)#对列进行排序
df.sort_values(by='c')#对dataframe的某一series进行排序

rank
df.rank()#对值进行排名

merge
import numpy as np
df1=pd.DataFrame({'stu_no':['s1','s2','s3','s4','s5','s6','s7','s8'],
		   'score':np.random.randint(50,100,size=8)}
df2=pd.DataFrame({'stu_no':['s1','s2','s3','s5'],
                 'name':['张三','李四','王五','赵六']}
pd.merge(df1,df2,on='stu_no')#merge合并两张表,类似inner join
pd.merge(df1,df2,on='stu_no',how='left')#merge合并两张表,类似左连接

concat
df1=pd.DataFrame(np.arange(1,5).reshape(2,-1))     
df2=pd.DataFrame(np.zeros((2,2)))
pd.concat([df1,df2])#纵向叠加,行数变多
pd.concat([df1,df2],axis=1)#列叠加
		   
异常值的分析
df.head()#查看前两条
df.tail()#查看后两条
df.info()#查看表的属性(内存占用,数据类型等等
df.describe()#查看mean count min等
df.mean()#平均值
df.count()#个数
df.sum()#求和
df.sum(axis=1)#对列进行求和
df.a#获取a这一列
df.a.sum()#对a这一列进行求和
df.std()#获取标准差 体现波动
df.var()#获取方差

数据分组,透视表
df=pd.read_excel('./pandas中的数据分组与透视表.xlsx')
grouped=df.groupby('类别') #以类别进行分组,返回分组的对象
for name,data in grouped:
	print(name)
	print(data)#返回两个类别的两组表数据
grouped['金额','数量'].sum()#对各个组的列属性进行求和	
grouped['单价'].max()
grouped['类别','名称'].sum()
grouped['单价'].max()                                         
grouped[['单价']].mean() #表
查看表的各个类别
grouped=df.groupby('类别')
for name,data in grouped:
	print(name)
	print(data['名称'].unique())

对时间序列进行的操作
import time 
time.time()
time.localtime(415646546.556)
time.strftime(%Y-%m-%d %H:%M:%S,time.localtime(1566218389))#2019-8-19 20:39:49
local=time.strptime('1987-08-22 16:53','%Y-%m-%d %H:%M')
time.mktime(local)#测试经历的秒数

from datetime import datetime
now=datetime.now()
now.year
now.day#取出年月日
now.strftime(%Y-%m-%d %H:%M:%S)#2019-8-19 20:39:49

Pandas时间序列
pd.date_range('2018-5-1','2018-10-1')#初始化时间序列 显示出每一天,间隔频率,天数
pd.date_range('2018-5-1','2018-10-1',freq='w')#初始化时间序列 显示出每一周,间隔频率为周
#freq频率: S秒T分H小时D天Q季度M月
pd.date_range('2018-5-1',freq='Q',period=10)#从2018-5-1开始10个季度

生成日志
data={'time':pd.date_range('2019-8-19',freq='T',period=200000)
	   'cpu':np.random.randn(200000)+10#生成200000个随机cpu
df=pd.DataFrame(data,columns=['time','cpu'])	   
df.head()
现在是1分钟采样,改造dataframe让时间作为索引,改成5分钟一次作为索引,求5分钟平均值
df.index=pd.to_datetime(df.time)
df=df.drop('time',axis=1)#删除多余的列
df.info()#查看时间索引
df['2019-09-01 08:00:00':'2019-09-01 08:10:00']#筛选数据
df.groupby(df.index.date).mean()#通过日期分组求平均值
df.groupby(df.index.hour).mean()
df.groupby(df.index.week).mean()
df.resample('5T').mean()#重采样 5分钟一次



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值