Pandas
1.DataFrame 和 Series 的介绍
import pandas as pd #导入pandas 包
array = [[1,2,3],[3,4,5]] #创建列表
df = pd.DataFrame(array)
dict = {'name':['datafrog','data','frog'],'age':[18,19,18]} #创建字典
df = pd.DataFrame(dict)
s2 = pd.Series([2,3,4,5],index=['a','b','c','d']) #创建列表
s3 = pd.Series({'a':1,'b':2}) #创建字典
s2.to_frame() #列表与字典的转换
s2.to_frame().T #转至
2.DataFrame 的常用属性
index 行索引
columns 列索引
df.set_index('b') #引用b列做索引
info() 数据预览 用于查找空缺值
describe() 查看数据的各项指标,最大值、最小值、平均值、四分位置。用于查看异常值
head() 前五行
tail() 后五行
3.读写文件
filepath = 'stocks.csv'
pd.read_csv(filepath, header = 0)
pd.read_csv(filepath, skiprows=lambda x : x%2 == 0) #在读取中做一些计算
4.索引,切片
四种索引形式:
# 直接索引,获取第2 行
df.loc[2]
# 2.列表索引,列表可以是arange,range,ndarray ,series 都可以,列表形式即可
# 获取0,1,2 行
df.loc[[0,1,2]]
# 3.切片索引
df.loc[0:4]
# 4.bool类型索引
b1 = df['年龄']>30
iloc 和 loc 的区别
loc 是基于索引值的,切片是左闭右闭的
iloc 是基于位置的,切片是左闭右开的
df.loc[0:2] #选取0-2的数据
df.iloc[2] #选取第二行数据
df1 = df.set_index('用户ID') #用户ID 替代索引
df[['年龄','城市']].head() #按列名切片
# 修改列索引
df.columns=['name','age','sex','height']
# 使用 rename 函数进行修改列索引
df.rename(columns={'姓名':'name', '年龄':'age', '性别':'sex','身高':'height'},inplace=True)
# 替换一个值
df.replace({'name':{'小明':'xiaoming'}},inplace=True)
# 对数据进行排序
df.sort_values('age')
5.增删改查
# 累加求和
df.cumsum(0)
# 增加一列
df['player'] = 1
df
# 删除一列
del df['player']
df
# 删除行,labels 是行列的名字,默认axis=0删除行,为1则删除列
df.drop(labels=0)
# 修改一列的值,使用 map 函数
df.sex = df['sex'].map({'男':'female','女':'male'})
# 还可以使用 replace 函数进行替换
df.sex.replace('female','男',inplace=True)
df.sex.replace('male','女',inplace=True)
# 矩阵间得运算
# a.相同维度得矩阵加减乘除就是对应元素进行操作
df1=pd.DataFrame(np.random.random((5,10)),columns=list('abcdefghij'))
df2=pd.DataFrame(np.random.random((5,10)),columns=list('abcdefghij'))
df1*df2
6.Pandas 和 sql
数据拼接
left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'A': ['C0', 'C1', 'C2', 'C3'],
'B': ['D0', 'D1', 'D2', 'D3']})
# 简单的拼接
pd.concat([left,right])
pd.concat([left,right],ignore_index=True) #改变原始数据
关联操作
# 指定列进行关联,默认是 inner join
result = pd.merge(left,right,on='key')
result
# 如果有多个关联条件
result = pd.merge(left, right, on=['key1', 'key2'])
result
# 通过指定 how 来确定关联方式
#左连接
result = pd.merge(left, right, how='left', on=['key1', 'key2'])
#右连接
result = pd.merge(left, right, how='right', on=['key1', 'key2'])
#外连接
result = pd.merge(left, right, how='outer', on=['key1', 'key2'])
result
# 列名不一样怎么关联
pd.merge(left,right,left_on = ['key1','key2'],right_on = ['key3','key4'])
# 通过索引来关联
left.set_index('key1',inplace=True)
right.set_index('key3',inplace=True)
分组计算
df.district.unique() #查看所有单独值
df.district.value_counts().head() #分组计算
# 假设我们想知道每一个地区的客户数量
groups = df.groupby('district')
type(groups)
# groupby 对象的方法
groups.size()
groups.groups
# 作用多个聚合函数
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})
转换过滤
# 对数据进行操作,一般数据量不变
s_score = lambda s : (s-s.mean())/s.std()
groups = df.groupby("district")
groups[['age','novip_buy_times','novip_buy_moneys']].transform(s_score)
df['vip_buy_times_percent'] = df['vip_buy_times']/groups['vip_buy_times'].transform('sum') #增加变量
# 分组过滤
df2 = groups.filter(lambda g : g['vip_buy_moneys'].mean() >= 2000)
df2.district.value_counts()
pandas 连接 mysql
import pandas as pd
import sqlalchemy
sql='select * from stu'
engine = sqlalchemy.create_engine('mysql+pymysql://root:mysql@localhost:3306/data')
df = pd.read_sql(sql,engine)
# 写入数据到 mysql
# 还有参数if_exists,表示有则插入
df1.to_sql('stu',engine,index=False,if_exists='append')
Numpy
1.numpy 的介绍和数据类型
import numpy as np
vector = np.array([5, 10, 15, 20])
# 构造一个 ndarray
matrix = np.array([[5, 10, 15], [20, 25, 30], [35, 40, 45]])
matrix
# 注意 ndarray 的值类型都是统一的
# 填充指定值
np.full([3,4],1)
# 填充0值
np.zeros ((3,4))
# 使用 arange 生成序列
# 起始为10,5为步长,30为结尾取不到
np.arange( 10, 30, 5 )
#随机矩阵: random.random 后面的 (2,3) 表示要得到一个2行3列的矩阵,默认会产生 -1 到 +1 的随机值。
np.random.random((2,3))
# 平均划分
from numpy import pi
np.linspace( 0, 2*pi, 100 )
2.numpy 的切片和索引
# 使用切片
data[0:3,[0,1]] #0到2行0到1个数字
# bool 索引
vector == 10
# 多个条件判断
res = (vector == 10) | (vector == 20)
res
3.转换,运算
# 类型及转换
vector.dtype
vector.astype('float')
# 所有元素求和
vector.sum()
# 求指数
np.exp(matrix)
# 开方
np.sqrt(matrix)
# 多维变一维
matrix.ravel()
# 矩阵的扩展
a = np.arange(0, 40, 10)
b = np.tile(a, (3, 5)) # 行变成3倍,列变成5倍
# 矩阵的拼接:
a = np.floor(10*np.random.random((2,2)))
b = np.floor(10*np.random.random((2,2)))
# 水平拼接 np.hstack((a,b))
# 竖直拼接 np.vstack((a,b))
# 竖直分割 np.hsplit(a,3)
# 水平分割 np.vsplit(a,3)