Python——最全的Numpy Pandas库的学习笔记

2 篇文章 0 订阅
1 篇文章 0 订阅

Numpy

属性

arr = np.array([10,20,20])

arr.ndim 		# ndarray对象的秩,即轴的数量或维度的数量  返回1、2、3
arr.shape		# ndarray对象的尺度,对于矩阵,n行m列  返回元素
arr.size		# ndarray对象元素的个数,相当于.shape中n*m的值
arr.dtype		# ndarray对象的元素类型 
arr.itemsize	# ndarray对象中每个元素的大小,以字节为单位

数组的创建

# 从Python中的列表、元组等类型创建数组
x = np.array(list/tuple, dtype=np.float32)

# 采用numpy中的特定函数创建数组,可使用dtype=np.float32来指定类型
np.arange(n) 		# 类似range()函数,返回ndarray类型,元素从0到n‐1
np.arange(10)
>>> array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

np.ones(shape) 		# 根据shape生成一个全1数组,shape是元组类型
np.ones((3,2))
>>> array([[1., 1.],
           [1., 1.],
           [1., 1.]])

np.zeros(shape)		 # 根据shape生成一个全0数组,shape是元组类型
np.full(shape,val)	 # 根据shape生成一个数组,每个元素值都是val
np.eye(n)			# 创建一个正方的n*n单位矩阵,对角线为1,其余为0
np.ones_like(a)			# 根据数组a的形状生成一个全1数组
np.zeros_like(a)		# 根据数组a的形状生成一个全0数组
np.full_like(a,val)		# 根据数组a的形状生成一个数组,每个元素值都是val

# 其他函数创建数组
np.linspace(1,10,4) 		# 根据起止数据等间距地填充数据,形成数组  起点a 终点b 共c个数
np.concatenate((a,b))       # 将两个或多个数组合并成一个新的数组

数组的变换

a = np.ones((2,3,4),  dtype=np.int32)

# 数组的维度变换
a.reshape(shape)     # 不改变数组元素,返回一个shape形状的数组,原数组不变
a.resize(shape)      # 与.reshape()功能一致,但修改原数组
a.swapaxes(ax1,ax2)  # 将数组n个维度中两个维度进行调换
a.flatten() 		# 对数组进行降维,返回折叠后的一维数组,原数组不变

# 数组的类型变换
new_a  = a.astype(new_type)
# 数组转列表
ls = a.tolist()

数组的运算

# 数组与标量之间的运算作用于数组的每一个元素

# 一元函数
np.abs(x)  np.fabs(x)         # 计算数组各元素的绝对值
np.sqrt(x) # 计算数组各元素的平方根
np.square(x) # 计算数组各元素的平方
np.log(x)  np.log10(x)   np.log2(x) # 计算数组各元素的自然对数、10底对数和2底对数
np.ceil(x)  np.floor(x)     # 计算数组各元素的ceiling值  或  floor值
np.rint(x) # 计算数组各元素的四舍五入值
np.modf(x) # 将数组各元素的小数和整数部分以两个独立数组形式返回
np.cos(x)  np.cosh(x)
np.sin(x)  np.sinh(x)
np.tan(x)  np.tanh(x)
# 计算数组各元素的普通型和双曲型三角函数
np.exp(x) # 计算数组各元素的指数值
np.sign(x) # 计算数组各元素的符号值,1(+), 0, ‐1(‐)

# 二元运算
+* / **   		# 两个数组各元素进行对应运算
np.maximum(x,y)  np.fmax()
np.minimum(x,y)  np.fmin()
# 元素级的最大值/最小值计算
np.mod(x,y)    		# 元素级的模运算
np.copysign(x,y) 	# 将数组y中各元素值的符号赋值给数组x对应元素
> < >= <= == !=  	# 算术比较,产生布尔型数组

随机数函数

np.random.*
# 生成随机数
np.random.rand(d0,d1,..,dn) 	# 根据d0‐dn(矩阵尺寸)创建随机数数组,浮点数,[0,1),均匀分布
np.random.randn(d0,d1,..,dn) 	# 根据d0‐dn(矩阵尺寸)创建随机数数组,标准正态分布
np.random.randint(low[,high,shape])     # 根据shape创建随机整数或整数数组,范围是[low, high)
np.random.seed(s) 				# 随机数种子,s是给定的种子值

# 打乱数组
np.random.shuffle(a) 		# 根据数组a的第1轴进行随排列,改变数组x
np.random.permutation(a) 	# 根据数组a的第1轴产生一个新的乱序数组,不改变数组x
choice(a[,size,replace,p])  # 从一维数组a中以概率p抽取元素,形成size形状新数组 replace表示是否可以重用元素,默认为False

# 产生特定分布的随机数
np.random.uniform(low,high,size)     # 产生具有均匀分布的数组,low起始值,high结束值,size形状
np.random.normal(loc,scale,size)     # 产生具有正态分布的数组,loc均值,scale标准差,size形状
np.random.poisson(lam,size) 		# 产生具有泊松分布的数组,lam随机事件发生率,size形状

统计函数

np.sum(a, axis=None) 	# 根据给定轴axis计算数组a相关元素之和,axis整数或元组
np.mean(a, axis=None) 	# 根据给定轴axis计算数组a相关元素的期望,axis整数或元组
np.average(a,axis=None,weights=None)    # 根据给定轴axis计算数组a相关元素的加权平均值
np.std(a, axis=None) # 根据给定轴axis计算数组a相关元素的标准差
np.var(a, axis=None) # 根据给定轴axis计算数组a相关元素的方差
np.min(a)  np.max(a) # 计算数组a中元素的最小值、最大值
np.argmin(a)  np.argmax(a) 		# 计算数组a中元素最小值、最大值的降一维后下标
np.unravel_index(index, shape) 	# 根据shape将一维下标index转换成多维下标
np.ptp(a) 		# 计算数组a中元素最大值与最小值的差
np.median(a) 	# 计算数组a中元素的中位数(中值)

矩阵运算 计算特征值

import numpy as np
c = np.dot(a,b)  # 两个矩阵点积
c = np.cross(a,b) # 两个矩阵叉乘

a = [[2,-1,0,0,0],
     [-1,2,-1,0,0],
     [0,-1,2,-1,0],
     [0,0,-1,2,-1],
     [0,0,0,-1,1]]
a = np.array(a)
eigenvalue, featurevector = np.linalg.eig(a)
# 对结果进行排序,从小到大
idx = eigenvalue.argsort()
eigenvalue = eigenvalue[idx]
featurevector = featurevector[idx]

排序

# 用某行进行排序
data = data[data[:,2].argsort()] 
# 对数组每行单独进行排序 默认axis=1
ele = np.sort(ele,axis=1)
# 对数组每列单独进行排序
ele = np.sort(ele,axis=0)
# 按照第0行进行排序
ele = ele[ele[:,0].argsort()] 

注 :

Numpy的笔记中,还缺少有关矩阵文件读取、矩阵运算、线性代数的相关内容。

Pandas

Pandas库可以认为是升级版字典,常用于进行数据分析处理,DataFrame数据可保存至Excel。

创建DataFrame

import pandas as pd
import numpy as np

# 直接创建 Eight为列名
df = pd.DataFrame({'EIGHT': ['ARE', 'YOU', 'OK?']})

# 从Numpy矩阵生成DataFrame
values = np.zeros((2,3), dtype='int32,float32')
index = ['x', 'y']
columns = ['a','b','c']
df = pd.DataFrame(data=values, index=index, columns=columns)

# 从列表生成DataFrame
columns = ['姓名学号','早餐','午餐','晚餐','宿舍楼','宿舍号','楼层号','姓名']
df = pd.DataFrame(data=ls, columns=columns)

# 字典生成DataFrame
columns = ['a','b','c']
df = pd.DataFrame.from_dict(dic2, orient='index',columns = columns)

# 从Excel中获取DataFrame
data = pd.read_excel('0.xlsx')
data = pd.read_excel(io,sheet_name = 0,header = 0,names = None,index_col = None,usecols = None,squeeze = False,dtype = None, ...

DataFrame操作

# 给DataFrame增加项目 .loc方法是根据index增加或修改内容   iloc方法是根据位置修改
df.loc[10] = [1,2,3]
df.loc[''] = [1,2,3]
df.iloc[0] = [1,2,3]

#使用DataFrame中的values方法,返回numpy数据
n = df.values
n = df.as_matrix()
n = np.array(df)

# DataFrame切片 'loc是根据索引值来提取值,iloc是根据位置提取值'
c = data.loc[1]
b = data.iloc[:,3]
d = data.iloc[1,3]

# 直接进行索引
df[column_name]  # 提取列名 返回一个Series
df[column_name][index_name]  # 返回内部的具体数值

# 修改索引
df.rename({'index_name':'new_index_name'},inplace=True)

DataFrame输出到excel

import pandas as pd
x = pd.DataFrame(data)
x.to_excel('data.xls',sheet_name='data')

# 输出到同一个sheet的不同位置 不同的sheet_name
with pd.ExcelWriter('0.xlsx',engine="openpyxl") as writer:
    df.to_excel(writer,index=True,index_label = '222',startrow = 10,startcol= 10)
    df.to_excel(writer,index=True,index_label = '222',startrow = 0,startcol= 0)
    mon1.to_excel(excel_writer=writer,sheet_name='201901')
    mon2.to_excel(excel_writer=writer,sheet_name='201902')
    
# 以上方式与下方等效
writer = pd.ExcelWriter("C:/Users/wlt/Desktop/XXX.xls")
mon1.to_excel(excel_writer=writer,sheet_name='201901')
writer.save()
writer.close()

pandas to_excel源代码

df.to_excel('0.xlsx',index=True,index_label = '222')
DataFrame.to_excel(excel_writer, sheet_name='Sheet1', na_rep='', float_format=None, columns=None, header=True, index=True, index_label=None, startrow=0, startcol=0, engine=None, merge_cells=True, encoding=None, inf_rep='inf', verbose=True, freeze_panes=None)

excel_writer:文件路径或现有的ExcelWriter。
sheet_name:它是指包含DataFrame的工作表的名称。
na_repr:缺少数据表示形式。
float_format:这是一个可选参数, 用于格式化浮点数字符串。
列:指要写入的列。
header:写出列名。如果给出了字符串列表, 则假定它是列名的别名。
index:写入索引。
index_label:引用索引列的列标签。如果未指定, 并且标头和索引为True, 则使用索引名称。如果DataFrame使用MultiIndex, 则应给出一个序列。
startrow:默认值0。它指向转储DataFrame的左上单元格行。
startcol:默认值0。它指向转储DataFrame的左上方单元格列。
engine:这是一个可选参数, 用于写入要使用的引擎, openpyxl或xlsxwriter。
merge_cells:返回布尔值, 其默认值为True。它将MultiIndex和Hierarchical行写为合并的单元格。
encoding:这是一个可选参数, 可对生成的excel文件进行编码。仅对于xlwt是必需的。
inf_rep:它也是一个可选参数, 默认值为inf。它通常表示无穷大。
详细:返回一个布尔值。它的默认值为True。
它用于在错误日志中显示更多信息。
Frozen_panes:它也是一个可选参数, 用于指定要冻结的最底部一行和最右边一列。

Excel 格式修改

import pandas as pd
import openpyxl

#生成一个DataFrame
data= pd.DataFrame(data=np.random.randn(6,3),columns=["a",'b','c'])

#filename 保存的文件名
filename = 'test.xlsx'
writer = pd.ExcelWriter(filename,engine='openpyxl')
data.to_excel(writer, sheet_name='Sheet1',index=False)
worksheet = writer.sheets['Sheet1']

#冻结首行
worksheet.freeze_panes = 'A2'
#冻结首行首列
worksheet.freeze_panes = 'B2'

#迭代器  取列
for i in worksheet.columns:
    i[0].fill = openpyxl.styles.PatternFill("solid", fgColor="FF9933")  #修改首行背景色
    i[0].font = openpyxl.styles.Font(name='Calibri',size=11,bold=True,
                                     italic=False,vertAlign=None,underline='none',strike=False,color='FF000000')

# 修改首行字体
# 更改单元格格式
for cell in i[1:]:
    cell.number_format = '#,##0_-'  #千位分割
    cell.number_format = '0.00%;-0.00%' #百分比
    cell.number_format = '$#,##0.00;-$#,##0.00'  #会计格式

#取行
qtyindex = None
for row in worksheet.rows:    #取列名为c的列
    for j in row:
        if j.value =='c':
            qtyindex = j.col_idx-1      
    break
a = 0
for row in worksheet.rows:
    a +=1
    if qtyindex and status_index and a>1:   #按行 列名为c 的值大于0时: 填充颜色
        if row[qtyindex].value > 0 :  
            for cell in row:
                cell.fill = openpyxl.styles.PatternFill("solid", fgColor="FFB6C1")

for i in range(1,data.shape[1]+1):   把列索引转换成 A,B...表示
        str = ''
        while (not (i // 26 == 0 and i % 26 == 0)):
            temp = 25
            if (i % 26 == 0):
                str += chr(temp + 65)
            else:
                str += chr(i % 26 - 1 + 65)
            i //= 26
        writer.sheets['Sheet1'].column_dimensions[str[::-1]].width = 16
#如果不转成'A,B,C,D..'保存时可能会出错
writer.save()
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lzn_nzL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值