jupyter创建虚拟环境
在cmd环境下创建虚拟环境命令:
conda env list -n env_name python=3.7(版本可任意指定,env_name为自己命名,如my_py)
或者这样写 conda create --name my_py python=3.7
查看当前拥有的虚拟环境 conda env list
删除虚拟环境 conda remove -n my_py --all
进入虚拟环境 conda activate my_py
退出虚拟环境 conda deactivate
让虚拟环境自动关联notebook,安装命令 conda install nb_conda
指定下载镜像 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyecharts
1.DataFrame
创建df = pd.DataFrame(array)
查看类型 type(df)
查看数据类型 df.dtype(s)
返回ndarray类型的对象 df.values (ndarray 的值类型都是统一的)
获取行索引 df.index
获取列索引 df.columns
查看一列有多少种值 df.age.unique()
设置性别列为行索引 df.set_index('性别')
获取行及列索引 df.axes
数据预览 df. info()
查看数据按列的统计信息 df.describe()
显示前 i 行数据 df.head(i)
显示后 i 行数据 df.tail(i)
查看大小 df.size
输出行数 df.shape[0]
输出列数 df.shape[1]
输出行列 df.shape
求极值 df.max() df.min()
求均值 df.mean()
求总和 df.sum()
计算标准差 df.std()
求出现次数 df.age.value_counts().head()
累加求和 df.cumsum(0) 也可写成np.cumsum(df,0) (其中的传入参数0表示axis=0,即按照行累加)
修改列索引 df.columns=['name','age','sex','height']
使用rename函数修改列索引 df.rename(columns={'姓名':'name', '年龄':'age', '性别':'sex'},inplace=True)
替换一列值 df.sex.replace('female','男',inplace=True) df.sex.replace('male','女',inplace=True)
还可以使用map函数替换 df.sex = df['sex'].map({'男':'female','女':'male'})
排序 df.sort_values(['age','height'],ascending=[True,False])(ascending=True默认,False表示降序。ascending=[True,False]先升序后降序,若都降序写一个即可)
增加一列 df['列名'] = 1 (赋值为1)
删除一列 del df['列名']
删除一行 df.drop(labels=0) (labels 是行列的名字,默认axis=0删除行,为1则删除列)
最值的索引位置 df.idxmax()
给空值赋值零 df.fillna(0)
2.DataFrame 与 Series
Series创建 s1 = pd.Series([1,2,3,4])
查看类型 type(s1)
转dataframe类型 s1.to_frame()
转置 s1.to_frame().T(行与列对调)
dataframe series区别dataframe里的一维数组为series类型
3.pandas读取文件
pd.read_csv(filepath, header = 0) 从文件第0行读起(文件行数从0开始计数)
pd.read_csv(filepath,skiprows=[1,2]) 从文件第0行读起,跳过文件第1第2行
pd.read_csv(filepath, skiprows=lambda x : x%2 == 0) 跳过取余2等于0的行
pd.read_csv(filepath, header=2, skiprows = 2) 从第四行开始读起
pd.read_csv(filepath,keep_default_na=False) 保持数据原样输出(默认为True,会使无数据的输出为NaN)
4.pandas的索引
选取行
(1)位置索引,获取第2 行 df.loc[2]
(2)列表索引,获取0,1,2行 df.loc[[0,1,2]]
(3)切片索引 df.loc[0:4]
(4)布尔索引 df['年龄']>30 (返回的是索引列+年龄列的布尔值)
df.loc[df['年龄']>30] (返回筛选后的整表,与df[df['年龄']>30] 效果相同)
**iloc 和 loc 的区别**
(1) loc 是基于索引值的,切片是左闭右闭的
(2) iloc 是基于位置的,切片是左闭右开的
选取列
df[['年龄','城市']].head()
选取行列
df.loc[[0,3],['年龄','性别']]
df.loc[df['年龄']>18,:]
df.loc[0:5,'年龄'] 取年龄列的前0-5个值(索引值不存在0:5时)
一些索引语句
as_index=True默认,False表示不展示索引项
inplace=False(默认)表示原数组不变,对数据进行修改之后结果给新的数组。
inplace=True表示直接在原数组上对数据进行修改。
reset_index用来重置索引,因为有时候对dataframe做处理后索引可能是乱的。
drop=True就是把原来的索引index列去掉,重置index。
drop=False就是保留原来的索引,添加重置的index。两者的区别就是有没有把原来的index去掉。
5.数据关联
拼接 pd.concat([left,right],ignore_index=True) (ignore_index=True 重置index, 为False保留之前的index,默认False)
pd.concat([left,right],axis=1) (asix 为0是为上下合并(有相同的列),为1时为横向的合并(有相同的行))
内连接(默认) result = pd.merge(left,right,on=['key1', 'key2'])
外连接 pd.merge(left, right, how='outer', on=['key1', 'key2'])
左连接 result = pd.merge(left, right, how='left', on=['key1', 'key2'])
右连接 pd.merge(left, right, how='right', on=['key1', 'key2'])
列名不一如何关联(内连接) pd.merge(left,right,left_on = ['key1','key2'],right_on = ['key3','key4'])
通过索引关联(外连接) pd.merge(left,right,left_index=True,right_index=True)
6.分组操作
groups = df.groupby('district') 地区聚合
groups.groups 索引列所在行的集合
len(groups)
for name,group in groups:
print(name) 打印地区名
groups.agg([np.mean,np.sum,np.std]) 每一列都求多个聚合函数
groups.age.agg([np.mean,np.sum,np.std]) 针对具体列聚合
groups.agg({"age":np.mean,"novip_buy_times":np.sum}) 不同列不同聚合函数
7.转换过滤
transform函数
s_score = lambda s : (s-s.mean())/s.std()
groups = df.groupby("district")
groups[['age','novip_buy_times','novip_buy_moneys']].transform(s_score)
分组过滤
df2 = groups.filter(lambda g : g['vip_buy_moneys'].mean() >= 2000)
df3.round({'A':1,'C':2}) (round(列名,小数点位数)默认保存整数)
8.pandas连接mysql
import pandas as pd
import numpy as np
import pymysql
pymysql.install_as_MySQLdb()
from sqlalchemy import create_engine
engine = sqlalchemy.create_engine('mysql://用户名:登陆密码@主机地址:端口号/数据库?charset=gbk',echo=False)
sql='select * from stu'
df = pd.read_sql(sql,engine)
从mysql读取数据:
df1 = pd.DataFrame({'name':['zhangsan','wagnwu','zhaoliu'],
'age':[18,19,17]})
写入数据到mysql:
df1.to_sql('stu',engine,index=False,if_exists='append')
9.numpy.ndarray
构造一个 ndarray:
matrix = np.array([[5, 10, 15], [20, 25, 30], [35, 40, 45]])
快速创建 一个三行四列的ndarray且填充指定值1:np.full([3,4],1)
填充0值:np.zeros ((3,4))
填充1值:np.ones( (2,3,4)) (二维三行四列数组)
使用 arange 生成序列:np.arange( 10, 30, 5 ) (起始为10,5为步长,30为结尾取不到)
np.arange(12).reshape(4,3) (四行三列,从0到11)
随机矩阵:np.random.random((2,3)) (得到一个2行3列的矩阵,默认会产生 -1 到 +1 的随机值)
平均分配:
from numpy import pi
np.linspace( 0, 2*pi, 100 ) (0到2*pi平均分成100等份)
进行其他操作:np.sin(np.linspace( 0, 2*pi, 100 ))
10.numpy的切片和索引
直接索引 matrix[1,4] matrix[[0,1],[2,3]](0行开始计数)
使用切片 data[0:3,[0,1]] (切片左闭右开)
bool 索引 matrix==10
多个条件判断 res = (matrix == 10) | (matrix == 20) (输出bool值)
vector[res] (输出筛选后的ndarray)
11.数据可视化
plt.subplot(221)表示将整个图像窗口分为2行2列, 当前位置为1.
plt.subplot(223)表示将整个图像窗口分为2行2列, 当前位置为3(第二行第一列).
第一个参数代表子图的行数;第二个参数代表该行图像的列数; 第三个参数代表每行的第几个图像。