数据文件读取
read_**系列函数
pd.read_csv() #读取逗号分隔的文件,会把第一行作为列索引
header=None 不把第一行作为列索引
header=num把第几行作为列索引
pd.read_csv(filepath,header=None)
pd.read_csv(filepath,header=2) 如果header=num,则把第几行作为列索引
names=[ ] 自定义列索引
pd.read_csv(filepath,header=None,names=['列1','列2','列3']) 自己设置列索引
usecols=[1,2,3,4,5,6] 指定获取哪些列
sep 设定分隔符,
engine设置解析引擎,默认是C速度快,只支持单个字符。可以设置为python,支持多个字符,速度慢
encoding='utf-8' 设置编码
index_col=2 设置第3列作为 行索引
index_col="name" 用列索引名字设置哪个列为行索引
pd.read_csv(filepath,sep="::",engine="python")默认不设置是逗号,
df.to_csv("filepath",sep=",",header=None) # 存到csv文件
read_excel(filepath) 读取excel文件
sheet_name=""设置读取哪个页面
保存文件
to_excel(filepath)
read_sql() 从sql中读取
db=pymysql.connect()
df=pd.read_sql("select * from table",con=db) #con=数据库连接
df[df.columns[2:]] 数据过滤,按列切片
异常值处理
dropna 删除异常值,不影响原数组,返回处理后的数组
df.dropna():删除含有异常值的行数据
df.dropna(how="all") 设置删除的条件,容忍度all,所有都是nan才删除
df.dropna(axis=1) 删除有异常值的列
*******
#默认情况下axis,0是列,1是行。但是处理nan值的时候,是反过来的,1是列
dropna()默认删除异常值的行数据
mean() 默认统计的是列的均值
*******
fillna() 填充异常值,不影响原数组,返回处理后的数组
df.fillna(0) 所有异常值用0填充
df.fillna({'语文':60,"数学":0}) 每列异常值填充不同值
df.fillna(method='bfill') 使用下一行数据填充异常值,最后一行没法处理
df.fillna(method='ffill')使用上一行数据填充
df.fillna(method='ffill',axis=1) 使用前一列的数据填充
df.fillna(method='bfill',axis=1)使用下一列数据填充
isnull() 判读是否是空
notnull() 判断是否不为空
常见的数学统计方法
count() 统计非nan值的数量,分列统计
describe() 计算每列总统计值
min() 每列的最小值。设置axis=1,每行的最小值
max()
mean()
sum()
idxmax() 每列第一次出现最大值的位置
idxmin() 每列第一次出现最小值的位置
np.where(df['key']==df['key'].min()) 所有最小值的位置
argmin,argmax已被弃用,也是获取最大小值位置
df['语文'].argmin()
quantile() 计算样本的分位数
df.quantile(0.5) 中位数
median() 获取中位数
mad() 每列的平均绝对距离差
var() 方差
std() 标准差
cumsum() 累计和
cumprod() 累计积
cummin() 累计最小值
cummax() 累计最大值
pct_change() 样本的百分比变化 (next-before)/before
相关系数和协方差
协方差
如果有X,Y两个变量,每个时刻的“X值与其均值之差”乘以“Y值与其均值之差”得到一个乘积,再对这每时刻的乘积求和并求出均值。
如果协方差为正,说明X,Y同向变化,协方差越大说明同向程度越高;如果协方差为负,说明X,Y反向运动,协方差越小说明反向程度越高。
取值范围: -inf ~ +inf
函数:cov()
用法:df[1].cov(df[2])
相关系数
就是用X、Y的协方差除以X的标准差和Y的标准差。所以,相关系数也可以看成协方差:一种剔除了两个变量量纲影响、标准化后的特殊协方差。
1.也可以反映两个变量变化时是同向还是反向,如果同向变化为正,反向变化为负
2.由于它是标准化后的协方差,因此更重的特性是,它消除了两个变量变化幅度的影响,而只是单纯反应两个变量单位变化的相似程度。
注意: 相关系数不像协方差一样可以在+\infty 到-\infty 间变化,它只能在+1到-1之间变化
当相关系数为1的时候两者相识度最大,同向正相关
当相关系数为0的时候两者没有任何相似度,两个变量无关
当相关系数为-1的时候两者变化的反向相似度最大,完全反向负相关
函数:corr()
用法:df[1].corr(df[2])
唯一值
unique方法用于获取Series中的唯一值数组(去重数据后的数组)
unique() 对某一列计算,Series的函数
值计数
value_counts() 对每一个值出现的次数做统计,并且降序统计
成员资格
用于判断矢量化集合的成员资格,可用于选取Series中或者DataFrame中列中数据的子集
isin()
df[df[1].isin([1,2,3,4,5,6])]
层次索引
在某一个方向拥有多个(两个及两个以上)索引级别 通过层次化索引,pandas能够以较低维度形式处理高纬度的数据 通过层次化索引,可以按照层次统计数据。
set_index() 把某一列设置为索引
set_index('类型')
df=pd.DataFrame({
"年份":[2017,2018,2017,2016,2017,2019,2014],
"类型":['苹果','香蕉','梨','苹果','香蕉','梨','苹果'],
"产量":[201,334,567,101,1100,2000,3000],
"单价":[3,6,9,3,6,9,3]
})
df=df.set_index(['年份','类型'])
df
df.set_index(['年份','类型']) #同时把年份和类型作为索引,有两个索引
两个索引的取值
df.loc[2017] #获取到包括年份的索引
df.loc[2017,'苹果']
level索引层级
df.mean(level=0) 按年份求均值
df.mean(level=1) 按类型求均值
df.sort_index() 索引排序
df.sort_index(level=1)
重置索引
df.reset_index() 去掉索引,变成正常列表
交换索引层级位置
swaplevel()
unstack() 可以把层次索引中的某一层,作为列索引
stack() 把列索引作为行的层次索引
排序和排名
sort_index() 索引排序
df.sort_index()
df.sort_index(ascending=False) 行索引排序倒序
df.sort_index(axis=1,ascending=False) 对列索引排序,倒序
sort_values() 对值排序
df.sort_values(by='Z') 对Z列排序
df.sort_values(by=['Z','X']) Z列相同情况按X列排序
df.sort_values(by=['Z','X'],ascending=[True,False]) Z列升序,X列降序
df.sort_values(by='a',axis=1) a行排序
排名
rank 会增设一个排名值,从1开始到n
并列排名时,默认用均值 (2+3)/2=2.5名 method='average'
df.rank(method='min') 并列时用最小的
df.rank(method='max') 并列时用最大的
df.rank(method='first') 并列时,谁先出现排名靠前
时间序列
date_range(start,end,periods,freq=)
start 开始时间
end 结束时间
periods 生成的数目
freq 步进值,每隔多长时间生成一次
天:D 月份:M 小时:H 分钟:T or min 秒:S
freq 详解:
day.index=pd.date_range(start='2019-01-01',periods=100,freq='D')
表合并
merge(data1,data2,left_on,right_on,how='inner')
left_on 左表合并字段
right_on 右表合并字段
how inner内连接 outer外连接 left right
pd.merge(stu,score,left_on="字段1",right_on="字段2",how='inner')
left_on和right_on只能用正常字段,不能用索引字段
如果要用索引连接的话,用left_index=True 或者 right_index=True
suffixes=("_x","_y") 如果出现同名字段的时候,加上小尾巴
堆叠多个表
concat()
pd.concat([stu,stu2],sort=True,join="inner")
jion="inner" 去掉对不上的列,默认是outer
axis=1水平堆叠,默认是垂直堆叠
分组
groupby()
返回Groupby对象,可以for遍历
stu.groupby('字段').count() 分组聚合计算
df.group(8)[10].mean() 对第8列聚合,统计第10列的均值
df.group(8)[[10,11]].mean() ,对两列做聚合统计均值
df.group([8,5])[[10,11]].mean() 对8,5列做分组统计
apply函数
多和groupby一起使用,做聚合运算
可以对Series,DataFrame,Groupby对象做操作
1、对Series进行apply操作
ser.apply(func) 对每一个值做处理
ser.apply(lambda x:x+1)
2、对DataFrame进行apply操作
def f1(x):
print(x)
stu.apply(f1) 把每一列传入f1
axis=1 把每一行传入f1
3、对分组对象进行apply操作
def f2(x):
print(x)
stu.groupby("sex").apply(f2)
每次传入每一个分组的DataFrame
agg函数
可以有多个聚合函数,也可以传入自定义的函数
df.groupby('address')['money'].agg(['max','min'])
replace函数
对df中的值进行替换
df.replace({"男":1,"女":0})