Pandas基础笔记

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(第二行第一列).

第一个参数代表子图的行数;第二个参数代表该行图像的列数; 第三个参数代表每行的第几个图像。





























你可能感兴趣的:(Pandas基础笔记)