科学计算库(五)pandas 基本功能操作

数据文件读取

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})

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值