pandas学习笔记

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之间随机数列 104列
np.random.randn(3,3) 随机正态分布浮点 33列 平均数0 方差为1 波动不大3以上-3以下
np.random.uniform(1,1.9,size=[3,3]) 均匀分布 随机浮点33列
np.random.uniform(160,190,20)均匀分布 160-190 之间 20个  随机整数
np.random.normal(1,1.9,size=[3,3]) 正态分布对比学习 随机浮点33列
np.random.normal(9000,3000,size=300)3-9千 生成300个 随机整数
np.random.random((3,3))随机浮点33列
随机排列数组
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之间随机数列 104列

列表生成法
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()
DWMH小时  TSQ季度

生成时间序列 pd.date_range('1','2',freq='W')
pd.date_range('2018-5-1','2018-10-1',freq='W')
freq=  DWMH小时  TSQ季度


分组与聚合操作 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)))220
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)

删除13列 从第一列往后步进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)))220
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=  DWMH小时  TSQ季度
生成一个已知 周期数目的 时间序列
pd.date_range('2018-05-01',freq='Q',periods=10)51日开始放回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.高级需求
整理DF5分钟一测 CPU5分钟均值 简化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代表分钟 取平均值
DWMH小时  TSQ季度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值