o pandas统计分析
知识点
.strip()删除首尾空格或字符
数据读取
用pandas导入数据 txt csv 等大多数文件格式
txt=pd.read_table('./数据科学原理与数据处理流程/03.txt')
txt可直接导入文件读为 dataframe格式 列与列之间以tab分隔可读
也可读入以 : 分隔的文件 sep分隔 header启用表头 names表头参数 sep='\t' 制表符分割空格 冒号 逗号 或正则符号
txt=pd.read_table('./数据科学原理与数据处理流程/03.txt',sep=':',header=None,
names=['name','pwd','uid','gid','local','home','shell'])
数据库迁移csv格式通用,分隔列 在excle文件 另存为时能选择以 , 为分隔的 csv文件
可以直接读取csv文件 pd.read_csv('./数据科学原理与数据处理流程/04.csv')
读取excel 文件需要安装插件
pip install xlrd
pd.read_excel('./pandas加载数据/05.xlsx')
读取html 文件需要安装插件 按照table表单得到信息
pip install lxml
tables=pd.read_html('./pandas加载数据/06.html',header=0) 如果有两张表 header设置在0位
table[0] 第一章表
table[1] 第二章表
从html找到此class的table
或者tables=pd.read_html('./pandas加载数据/06.html',
header=0,attrs={'class':'mydata'})
读取mysql
mysql交互界面 软件 navicat for mysql
下载三方库 pip install pymysql
import pymysql
con=pymysql.connect(host='localhost',user='root',password='12345', 连接数据库
database='doubandb',charset='utf8',user_unicode=True)
执行下面语句 后为mysql命令 导入此数据库文件 sql_cmd='select * from books2'
要执行的语句放1 连接放2 读连接 df=pd.read_sql(sql_cmd,con)
数据量太多让其显示前两行 df.head(2)
针对业务处理
%%timeit 一个代码块执行时间
%%time 一个代码块执行单次时间
1.df查看命令
df.semple(5)#随机采样5条
df.shape#查看数据条数
df.dtypes#看到时间不是时间对象而是字符串
df.info()#查看内存占用情况 总共 可以替代dtype
df['api'].describe()#查看接口是否相同 unique不同 freq重复
df.interval.describe()#std标准差 0无浮动 平均值是60 unique查看有多少种类型
df.interval.unique()#判断有无不同数据
2.删除命令
df=df.drop('api',axis=1)#优化内存 指定删除
df=df.drop(['id','interval'],axis=1)
3.时间索引和截取
df.index
df.index=pd.to_datetime(df.created_at)#转换字符串索引为时间类型 查找更快更方便
df['2019-5-1']
#切出一天数据 绘制出一天内接口调用情况
df['2019-5-1']['count'].plot()
#凌晨无人访问 下午2,3点第一个访问高峰 晚上8,9点 第二个访问高峰 #为凸显数据特征 重新以小时为单位采样
df2=df['2019-5-1']
4.重采样
df2=df2[['count']].resample['1H'].mean()#注意重采样是df格式
df2['count'].plot()
#重采样 为20分钟 重绘图
data=df['2019-5-1'].resample('20T').mean
data[['res_time_sum','res_time_min','res_time_max','res_time_avg']].plot()#注意上面已经筛选过了
#得到高峰时段结论
for inde in df_cai.index:遍历索引
df_cai.loc[inde] * y 每行每个元素乘以单价
(df_cai.loc[inde]*y).sum() 遍历索引定位数据乘元素价格得到当日总价格
统计每个类别一共花了多少钱
fenlei=df.groupby('类别','名称') dataframegroup对象 后面加名称查显示更全面
随机整数组多维
np.round(a,c)取整 a数据 c几位
np.random.seed(1-99) 此数字不变下面的数组固定
np.random.randint(50,100,size=8) 随机整数 50-100之间 8个
np.random.randint(0,10,size=(2,5))0-10 数组size两行 五列
随机浮点数组多维
np.random.rand(10,4)生成0-1之间随机数列 10行4列
np.random.randn(3,3) 随机正态分布浮点 3行3列 平均数0 方差为1 波动不大3以上-3以下
np.random.uniform(1,1.9,size=[3,3]) 均匀分布 随机浮点3行3列
np.random.uniform(160,190,20)均匀分布 160-190 之间 20个 随机整数
np.random.normal(1,1.9,size=[3,3]) 正态分布对比学习 随机浮点3行3列
np.random.normal(9000,3000,size=300)3千-9千 生成300个 随机整数
np.random.random((3,3))随机浮点3行3列
随机排列数组
arr = np.arange(9).reshape((3, 3))
np.random.permutation(arr)
df删除操作三种方法
axis=1(按列方向操作) inplace=True(修改完数据,在原数据上保存)
1.按标签来删除列
df.drop(['B','C'],axis=1,inplace=True)
2.按序号来删除列
x = [1,2] #删除1 2 列 多列需给定列表,否则参数过多
df.drop(df.columns[x],axis=1,inplace=True)
3.按序号来删除行
df.drop([0,1],inplace=True) #与上同 是列表 1 2行默认axis=0
标记条件
s = pd.Series(range(4))
s.mask(s > 0)
0 0.0
1 NaN
2 NaN
dtype: float64
series查找条件
s.where(s > 1, 10)大于1不为10
0 10
1 10
2 2
3 3
dtype: int64
dataframe条件处理2
df = pd.DataFrame(np.arange(10).reshape(-1, 2), columns=['A', 'B'])
m = df % 3 == 0
df.where(m, -df)
A B
0 0 -1
1 -2 3
2 -4 -5
3 6 -7
4 -8 9
dataframe查询行或列三种方法
1.iloc,在column name特别长或者index是时间序列等各种不方便输入的情况下
可以用iloc (i = index), iloc完全用数字来定位 iloc[row_index, column_index]
df.iloc[0,0] #第0行第0列的数据,'Snow'
df.iloc[1,2] #第1行第2列的数据,32
df.iloc[[1,3],0:2] #第1行和第3行,从第0列到第2列(不包含第2列)的数据
df.iloc[1:3,[1,2] #第1行到第3行(不包含第3行),第1列和第2列的数据
2.loc,在知道列名字的情况下,df.loc[index,column] 选取指定行,列的数据
# df.loc[index, column_name],选取指定行和列的数据
df.loc[0,'name'] # 'Snow'
df.loc[0:2, ['name','age']] #选取第0行到第2行,name列和age列的数据, 注意这里的行选取是包含下标的。
df.loc[[2,3],['name','age']] #选取指定的第2行和第3行,name和age列的数据
df.loc[df['gender']=='M','name'] #选取gender列是M,name列的数据
df.loc[df['gender']=='M',['name','age']] #选取gender列是M,name和age列的数据
3.df['column_name'] ,df[row_start_index, row_end_index] 选取指定整列数据
df['name']
df['gender']
df[['name','gender']] #选取多列,多列名字要放在list里
df[0:] #第0行及之后的行,相当于df的全部数据,注意冒号是必须的
df[:2] #第2行之前的数据(不含第2行)
df[0:1] #第0行
df[1:3] #第1行到第2行(不含第3行)
df[-1:] #最后一行
df[-3:-1] #倒数第3行到倒数第1行(不包含最后1行即倒数第1行,这里有点烦躁,因为从前数时从第0行开始,从后数就是-1行开始,毕竟没有-0)
散点图案例
生成二维表
data=pd.DataFrame(np.random.rand(10,4),columns=('A','B','C','D'))
生成0-1之间随机数列 10行4列
列表生成法
ser=pd.DataFrame(['lili','tom','liming'],index=list(range(1,4)))
字典生成法适合生成多列数据
df1=pd.DataFrame({'stu_no':['s1','s2','s3','s2','s1','s3','s4','s1'],
'score':np.random.randint(50,100,size=8)})
列表法带目录
df_man=pd.DataFrame(list(np.random.uniform(160,190,20)),columns=['man_high'],index=np.arange(1,21))目录
字典法带索引
df=pd.DataFrame({'name':['tom','lily','jack'],
'age':[18,19,17],
'height':[1.7,1.6,1.8]},
columns=['userName','name','height','email'],
index=range(1,4)
)
dfw=pd.DataFrame({字典法生成带索引
'h':np.random.uniform(160,190,20),
'y':np.ones(20)},
index=np.arange(1,21)
)
表插入列
df_woman.insert(0,'0',np.zeros(20))
df_woman['']=np.ones(20)
合并表
dfa=pd.concat([df_man,df_woman])
设置标题
dfa.columns=['high','y','x']
提取条件数据
dfa[dfa.x==0]
提取索引
dfa[dfa.x==0].index
提取数据
dfa[dfa.x==0].high
生成图表
plt.scatter(dfa[dfa.x==0].index,dfa[dfa.x==0].high,color='r')
plt.scatter(dfa[dfa.y==1].index,dfa[dfa.y==1].high,color='b')
show()方法不会显示对象信息
直方图
data=np.random.normal(9000,3000,size=300)生成正态分布数据 3千-9千 生成300个
data=data[data>=5000] 选5000以上的提取
plt.hist(data,color='g',rwidth=0.5,alpha=0.5,bins=30)
数据 颜色 柱宽 透明 柱数
plt.show()
1.生成案例数据
data={
'time':pd.date_range('2019-08-19',periods=200000,freq='T')
按分钟生成时间数列
'cpu':np.random.randn(200000)+10,生成cpu占用率
生成正态分布的数列 平均数0 方差为1 波动不大3以上-3以下
}
2.生成表 pd.dataframe(data,columns)
df=pd.DataFrame(data,columns=['time','cpu'])数据 标题
3.查看表 df.head
df.head()取前五条 df.tail() 取后五条
4.取出时间段内数据
df[(df.time >= '2019-8-21 08:00:00') & (df.time <= '2019-8-21 08:10:00')]
查看某日八点到八点十分数据
5.1转化格式 转化字符串为 时间格式 pd.to_datatime
df=pd.to_datetime(df.time)
5.2设置索引
df.index=df
5.3删除无用列 删除非索引time列
df=df.drop('time',axis=1)
5.4数据提取 查询 重采样 groupby(df.index.hour)
df.info查看表信息
df['2019-8-21 08:00:00':'2019-8-21 08:10:00']按照索引找出10分钟的采样
df['2019-8-19']查询指定日期一天的数据 时间数据格式
df.groupby(df.index.hour).mean()按照小时取每小时平均值
hour minute date month week 小时 分钟 天 月 周
重采样 按照5分钟 取cpu平均值 df.resample
df.resample('5T').mean()
D天 W周 M月 H小时 T分 S秒 Q季度
生成时间序列 pd.date_range('1','2',freq='W')
pd.date_range('2018-5-1','2018-10-1',freq='W')
freq= D天 W周 M月 H小时 T分 S秒 Q季度
分组与聚合操作 groupby df.sum df.max df.mean
import numpy as np
import pandas as pd
df=pd.read_excel('./pandas分组透视表/data.xlsx')导入表
fenlei=df.groupby('类别','名称') 按类别 名称分别分组 dataframegroup对象
for zu,detail in fenlei:组合细节遍历
print(zu)
print(detail)
fenlei['数量','金额'].sum() 分组总共数量 总金额
fenlei['单价'].max() 分类里最贵的
fenlei[['单价']].max() 分类价格最高 双括号变为dataframe显示更清晰
fenlei=df.groupby('类别')重新按照类别分类
for zu,detail in fenlei :显示每个分组中都有哪几种商品
print(zu)
print(detail['名称'].unique())按名称显示去重
表的连接方式 面试题 pd.merage(df1,df2,on='id',how='left')
df3=pd.merge(df1,df2,on='stu_no') 左右都有显示 无的刨除
数据库inner join连接方式 以stu_on为外键 外连接左右两张表都没有为空
df3=pd.merge(df1,df2,on='stu_no',how='left') 以左表为主 显示左有 右无则空
df3=pd.merge(df1,df2,on='stu_no',how='right') 以右表为主 显示右有 左无则空
df3=pd.merge(df1,df2,on='stu_no',how='outer') 左右元素全显示 无则空
concat数据表拼接 纵向 pd.concat([df1,df2],axis=1)
df1=pd.DataFrame(np.arange(1,5).reshape(2,-1)) 4个元素 2行
df2=pd.DataFrame(np.zeros((2,2)))2行2列 0
pd.concat([df1,df2])上下拼接
列拼接
pd.concat([df1,df2],axis=1)列拼接
文件读取 与分组 pd.read_excel()
df=pd.read_excel('./pandas分组透视表/data.xlsx')
统计每个类别一共花了多少钱
fenlei=df.groupby('类别','名称') dataframegroup对象 后面加名称查显示更全面
查询 逻辑判断 模糊
df[(df.created_at>='2019-5-1')&(df.created_at<'2019-5-2')]
注意括号 操作符不兼值 字符串模糊查询
numpy 有dtype
pandas有info
django加密
base64加密
加密的需要是b格式 转换用encode(utf-8)
面试题 merge两张dataframe合并
数据库inner_join连接方式 左右表元素一一对应上才会显示 少一个不显示
import numpy as np
初始化一张案例表
df1=pd.DataFrame({'stu_no':['s1','s2','s3','s2','s1','s3','s4','s1'],
'score':np.random.randint(50,100,size=8)})
df2=pd.DataFrame({'stu_no':['s1','s2','s3','s4'],
'name':['张三','李四','王五','赵六']})
表的连接方式
数据库inner_join连接方式 左右表元素一一对应上才会显示 少一个不显示
以stu_on为连接键
df3=pd.merge(df1,df2,on='stu_no') 左右都有显示 无的刨除
df3=pd.merge(df1,df2,on='stu_no',how='left') 以左表为主 显示左有 右无则空
df3=pd.merge(df1,df2,on='stu_no',how='right') 以右表为主 显示右有 左无则空
df3=pd.merge(df1,df2,on='stu_no',how='outer') 左右元素全显示 无则空
统计每个类别一共花了多少钱
fenlei=df.groupby('类别','名称') dataframegroup对象 后面加名称查显示更全面
数据分析与挖掘
pandas内存中类似关系型数据库有表的概念 把异常数据剔除
核心概念 列series 表 dataframe
1.介绍与安装
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pandas
数据选取操作
2.series操作
import pandas as pd
pd.__version__ 查看版本
列特性 索引id默认从0开始 数据类型np.array 索引还可为字符串
列的初始化
ser=pd.Series(['lili','tom','liming'])
自定义索引id
ser=pd.Series(['lili','tom','liming'],index=list(range(1,4)))
用字典初始化列 字符串为索引
data={'beijing':9240,'shanghai':8960,'guangzhou':7400}
ser3=pd.Series(data)
判断元素是否在集合内
'beijing' in ser3
用索引取一支数据 取到此时tom一系列
ser[2]
用索引取多支数据 取到lili与liming
ser[1,3]
修改id对应值
ser[2]='jack'
显示当前ser元素
ser.values
数组计算 每个元素加1
ser2=pd.Series([18,19,17],index=list(range(1,4)))
ser2+1
筛选数组偶数
ser2[ser2%2==0]
除2无余数条件
pd.Series可以转化为字典 json 列表 frame表
ser3.to_dict()转字典
ser3.to_list()转列表
ser3.to_json()转json
ser3.to_frame()转frame表
3.dataframe操作
把numpy转dataframe
data=np.arrange(100,109).reshape(3,-1)生成Numpy
df=pd.DataFrame(data)
把字典转dataframe
data={'name':['tom','lily','jack'],
'age':[18,19,17],
'height':[1.7,1.6,1.8]}
df=pd.DataFrame(data)
查看列名
df.columns
修改列名
df.columns=['userName','name','height']
初始化df增加列 无值为空值 常用
df=pd.DataFrame(data,columns=['userName','name','height','email'])
查看索引信息 df.index
得到RangeIndex(start=0, stop=3, step=1) 起始 终止 步进
修改索引信息 索引改为1-4
df=pd.DataFrame(data,columns=['userName','name','height','email'],index=range(1,4))
数据取列操作
df['name'] 或 df.name
格式为series
取列显示为dataframe
df[['name']]
取列修改总表不变方法
names=df.name.copy()
让总表数据不变 复制出此列数据
dataframe切片
df.columns[1:3]
切片取值 dataframe取列 1 2
df[[df.columns[1:3]]
新增frame 值为 出生年月 类似字典增加元素
import datetime
df['year']=datetime.datetime.now().year-df.age 当前时间 减岁数
删除列 axis=1列
df.drop('year',axis=1) 默
删除多列
df.drop(['year','height'],axis=1)
删除1,3列 从第一列往后步进2删除
df.drop(df.columns[1::2],axis=1)
数据提取行操作
df.loc[1]取索引为1 的行
df.loc[[1]]同上 但取出来格式dataframe
按索引值取倒数2个用户的数据 中name age
df.loc[df.index[-2:],['name','age']]
查看df结构 df.shape
在最后一行插入数据
df.loc[df.shape[0]]={'age':21,'name':'五九','height':1.66,'year':0}
删除行
df2=df.drop(2)
删除后重置id
df2.index=range(df2.shape[0])
通过物理索引找到对应元素
df2.iloc[2] 第二行
通过物理坐标定位到元素 2维
df2.iat[1,1] 一行一列
筛选查看 判断
df['height']>=1.65
筛选获得 获得
df[['height']>=1.65]
多个条件
df[(['height']>=1.65) & (['age']>=18)]
query筛选 df.query('height>=1.65 and age<=20')
通过外设变量引入查询 age=20
df.query('age<@age')表大于上面的age
isin方法 年龄在18 19中间 df[['age'].isin([18,19])] 取消外围中括号则为判断
df.T翻转x y轴
dataframe排序
df.sort_index()通过索引
df.sort_values()通过内容字母顺序
df.sort_index(ascending=False)索引反序 内容反序同 反序
df.sort_index(axis=1)dataframe列排序
df.sort_values(by='c',ascending=False)c为列名 False反序 按某一列排序
df.sort_values(by=['c','a'])先按c列 再按a列 排序
排名rank
同列按索引顺序算权重 相同值按索引相加除以个数 权重总数是列元素个数
df.rank()
按 每列 元素 出现先后 权重从上到下
df.rank(method='first')
按 每列元素 最大权重 从上到下
df.rank(method='max')
按 每列元素 最小值权重 从上到下
df.rank(method='min')
merge 两表合并 dataframe合并
import numpy as np
初始化一张案例表
df1=pd.DataFrame({'stu_no':['s1','s2','s3','s2','s1','s3','s4','s1'],
'score':np.random.randint(50,100,size=8)})
df2=pd.DataFrame({'stu_no':['s1','s2','s3','s4'],
'name':['张三','李四','王五','赵六']})
表的连接方式 面试题
df3=pd.merge(df1,df2,on='stu_no') 左右都有显示 无的刨除
数据库inner join连接方式 以stu_on为外键 外连接左右两张表都没有为空
df3=pd.merge(df1,df2,on='stu_no',how='left') 以左表为主 显示左有 右无则空
df3=pd.merge(df1,df2,on='stu_no',how='right') 以右表为主 显示右有 左无则空
df3=pd.merge(df1,df2,on='stu_no',how='outer') 左右元素全显示 无则空
concat数据表拼接 纵向
df1=pd.DataFrame(np.arange(1,5).reshape(2,-1)) 4个元素 2行
df2=pd.DataFrame(np.zeros((2,2)))2行2列 0
pd.concat([df1,df2])上下拼接
横向拼接
pd.concat([df1,df2],axis=1)横向
矩阵数据信息查看 对异常值空值处理
异常值分析
大量数据查看范例命令
df.head(2)显示头两行
df.tail(2)显示后两行
df.info()查看属性 每列的数据类型是否异常
df.describe()查看属性细节 mean平均值 %是中位数
df.a.sum()单列和
df.std()每列标准差 看数据离散程度 标注差越小数据波动越小 每个数据减去平均数据差值的平均数
df.var()每列方差 方差开根号是表准差 看数据离散程度
分组与聚合操作
import numpy as np
import pandas as pd
df=pd.read_excel('./pandas分组透视表/data.xlsx')
统计每个类别一共花了多少钱
fenlei=df.groupby('类别','名称') dataframegroup对象 后面加名称查显示更全面
for zu,detail in fenlei:
print(zu)
print(detail)
fenlei['数量','金额'].sum() 分类后分别求和
fenlei['单价'].max() 分类后最贵的
变成dataframe
fenlei[['单价']].max() 分类后最贵的 变为dataframe显示更清晰
fenlei=df.groupby('类别')
for zu,detail in fenlei :显示每个分组中都有哪几种商品
print(zu)
print(detail['名称'].unique())按名称显示去重
# todo pandas对时间的操作 表合并的几种方式 sort_values 与groupby
pandas对时间的操作
1.time模块
import time
time.time() 相对时间 时间戳
time.localtime()元组时间
得到元组时间 unstr=time.strptime('1987-08-22 16:53','%Y-%m-%d %H:%M:%S')
反元组时间 得到相对时间戳秒数 time.mktime(unstr)
用元组时间localtime得到显示时间
time.strftime('%Y-%m-%d %H:%M:%S',time.localtime())
2.datatime模块
from datetime import datetime 继承于上面的time是上面方法的封装
now=datetime.now() 得到时分秒毫秒 得到格式化时间 datetime对象
now.year now.month now.day now.hour now.minute now.second 得到年月日时分秒
now.strftime('%Y-%m-%d %H:%M:%S') 得到显示时间
用显示时间 返回格式化时间
datetime.fromtimestamp('556617180') 格式化时间戳得到datetime格式化时间
now.timestamp() 转化datetime对象为时间戳
时间计算datetime
delta=datetime.now()-datetime(2018,5,21) 都是格式化时间 得到时间差
得到当前时间与指定时间的差 delta.day delta.second delta.microseconds得到日秒毫秒
3.pandas时间序列
初始化时间序列 方便查询汇总
生成目标时间天数时间序列
pd.date_range('2018-5-1','2018-10-1') 格式dtype datetime64 频率freq='D'天 length=154
生成目标时间周数时间序列
pd.date_range('2018-5-1','2018-10-1',freq='W')
freq= D天 W周 M月 H小时 T分 S秒 Q季度
生成一个已知 周期数目的 时间序列
pd.date_range('2018-05-01',freq='Q',periods=10)从5月1日开始放回10个季度
时间序列生成索引案例操作
服务器log日志监控cpu占用过高 程序或黑客 导致宕机
1.生成案例数据
data={
'time':pd.date_range('2019-08-19',periods=200000,freq='T')按分钟生成20万条数据,
'cpu':np.random.randn(200000)+10,生成cpu占用率
生成符合正态分布的数列 平均数0 方差为1 波动不大3以上-3以下
}
2.生成表
df=pd.DataFrame(data,columns=['time','cpu'])数据 标题
3.查看表
df.head()取前五条 df.tail() 取后五条
4.取出时间段内数据
df[(df.time >= '2019-8-21 08:00:00') & (df.time <= '2019-8-21 08:10:00')]
查看某日八点到八点十分数据
5.高级需求
整理DF为5分钟一测 CPU取5分钟均值 简化DF
5.1转化格式
df=pd.to_datetime(df.time)转化字符串为 时间格式
5.2设置索引
df.index=df 把时间设置为索引
5.3删除无用信息
df=df.drop('time',axis=1)删除非索引time
5.4数据提取
df.info查看表信息
df.head()查看表格
df=df.DataFrame(df)转dataframe表
df['2019-8-21 08:00:00':'2019-8-21 08:10:00']按照索引找出10分钟的采样
df['2019-8-19']查询指定日期一天的数据 时间数据格式
df.groupby(df.index.hour).mean()按照小时取每小时平均值
hour minute date month week 小时 分钟 天 月 周
df.resample('5T').mean() 重采样方法按照5 T代表分钟 取平均值
D天 W周 M月 H小时 T分 S秒 Q季度
pandas学习笔记
最新推荐文章于 2025-06-01 21:09:33 发布