【python学习笔记之numpy与pandas】


numpy和pandas的关系

pandas是基于numpy构建的,让numpy为中心的应用更加简单

numpy篇

每一个np数组都有一个shape属性【获取数组维度】和dtype属性【获取数组类型】;
numpy可以在不编写循环的情况下进行矢量化运算

嵌套序列

嵌套序列,由一组等长列表组成
arr.ndim:外层数组的维度
arr.shape:(外层数组的维度,内层数组的维度)

#二维数组(嵌套序列)的访问
arr1 = np.array([[1,2,3],[4,5,6]])
print(arr1[0][1])
print(arr1[0,1])
#2
#2
arr1.ndim
#2
arr1.shape
#(2,3)

花式索引:

以一个特定的顺序选取行;利用整数数组进行索引

#对二维数组的访问
arr = np.empty((8,4))
for i in range(8):
    arr[i]=i
print(arr)
print(arr[[4,3,0,6]])#x选取的是特定的行

‘’‘
#print(arr)
 [[0. 0. 0. 0.]
 [1. 1. 1. 1.]
 [2. 2. 2. 2.]
 [3. 3. 3. 3.]
 [4. 4. 4. 4.]
 [5. 5. 5. 5.]
 [6. 6. 6. 6.]
 [7. 7. 7. 7.]]
#print([4,3,0,6])
[[4. 4. 4. 4.]
 [3. 3. 3. 3.]
 [0. 0. 0. 0.]
 [6. 6. 6. 6.]]
 ’‘’

reshape函数;
各种切片;
ix_()

arr2=np.arange(32).reshape(8,4)#将0-31进行排序,形成8行*4列的二维数组
print(arr2)
print(arr2[[1,5,7,2],[0,3,1,2]])#选出下标为(1,0)(5,3)(7,1)(2,2)的元素
#第一个[]选择的是行,第二个[]选的是列
'''
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]
 [16 17 18 19]
 [20 21 22 23]
 [24 25 26 27]
 [28 29 30 31]]
 
[ 4 23 29 10]
'''
print(arr2[[1,5,7,2]])#第1,5,7,2行被筛出
print(arr2[[1,5,7,2]][:,[0,3,1,2]]) #第1,5,7,2行的,':'表示所有列元素,0,3,1,2是行的顺序
#上面👆也可以写成  arr2[np.ix_([1,5,7,2],[0,3,1,2])]
'''
#print(arr2[[1,5,7,2]])
[[ 4  5  6  7]
 [20 21 22 23]
 [28 29 30 31]
 [ 8  9 10 11]]
#print(arr2[[1,5,7,2]][:,[0,3,1,2]])
[[ 4  7  5  6]
 [20 23 21 22]
 [28 31 29 30]
 [ 8 11  9 10]]
 '''

数组转置

数组转置:arr.transpose()

#三维数组的转置
arr = np.arange(24).reshape((2,3,4))
print(arr)#默认为(0,1,2)
print(arr.transpose(1,2,0))
'''
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]
  #转置后
[[[ 0 12]
  [ 1 13]
  [ 2 14]
  [ 3 15]]

 [[ 4 16]
  [ 5 17]
  [ 6 18]
  [ 7 19]]

 [[ 8 20]
  [ 9 21]
  [10 22]
  [11 23]]]
  '''

python的高阶函数

  • lambda函数【匿名函数】
    (适合一些简单表达式)

格式:lambda 参数列表 :函数体

  • 三元运算符

格式:(成立的结果 if condition 不成立结果)= np.where(condition,成功结果,失败结果)

  • map函数
    将interable中的书都实现func函数

格式:map(func,*iterable)

  • filter过滤器

格式:filter(func,iterable)

  • reduce函数
    下次运算用上次的结果

格式:(func,interable,初始值)
需要导包:from functools import reduce

  • zip函数

用于将迭代对象作为参数,将对象中对应元素打包成一个元组,并返回元组

矩阵的运算

dot:格式x.dot(y);矩阵乘法
trace:矩阵对角线之和
det:矩阵行形式
eig:计算特征值和特征向量
inv:求矩阵的逆


python的三大推导式

  • 列表推导式
    根据已有列表推导出新的列表
list= [1,2,3,4,5,6]
list1 = [i+i for i in list]
print(list1)
#[2, 4, 6, 8, 10, 12]
list2=[i+i for i in list if i>3]#有选择性的筛选
print(list2)
[8, 10, 12]
  • 集合推导式
    同上
list= {1,2,3,4,5,6}
list1 = {i+i for i in list}
print(list1)
#{2, 4, 6, 8, 10, 12}
list2={i+i for i in list if i>3}#有选择性的筛选
print(list2)
{8, 10, 12}
  • 字典推导式
s={
    'z':20,
    'l':15,
    'w':31
}
s_key = [key+'aaa' for key,value in s.items()]#拿出所有的key与‘aaa’拼接,并变成列表
print(s_key)
#['zaaa', 'laaa', 'waaa']
s1 = {value:key for key,value in s.items()}#key和value的位置颠倒
print(s1)
#{20: 'z', 15: 'l', 31: 'w'}
#进行条件选择时同上即可

numpy的文件操作

numpy中常用np.save和np.load进行读写数据,默认拓展名为.npy,压缩后文件的拓展名为.npz

import numpy as np
arr = np.arange(10)
np.save('a_array',arr)
np.load('a_array.npy')
#array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.savez('a_array1',a=arr)#保存成一个压缩文件,数组以关键字参数的形式传入,这里后缀.txt可以写可以不写,但是保存txt必须写后缀
np.load('a_array1.npz')['a']
#array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
#也可以将numpy保存为txt文件
np.savetxt('a_array2.txt',arr,delimiter=',')#保存成一个txt文件,分隔符为,
np.loadtxt('a_array2.txt',delimiter=',')
#array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])

pandas篇

pandas有使数据分析工作变得更快更简单的高级数据结构和操作工具

pandas里面有两种数据类型:series和dataframe
pandas可以进行reindex(重新索引),method可以设置none时的填充方法,fill:填充方法为nan;ffill:前项填充;bfill:后项填充;

数据的运算

  1. Series进行运算

重叠的地方相加减,不重叠的地方NaN填充

d1 = Series([1.3,1.5,2.6,-3.5],index = ['a','b','c','d'])
d2 = Series([-1.3,-1.5,-1.6,3.9,9.8],index=['a','b','c','d','e'])
print(d1+d2)
'''
a    0.0
b    0.0
c    1.0
d    0.4
e    NaN
'''
  1. DataFrame进行运算

pandas可以对不同索引对象进行算数运算,将dataframe对象相加,结果的索引是该索引的并集;默认用nan来填充;若规定fill_value=0,则用0来填充,且两者均空时才用nan填充

df1 = DataFrame(np.arange(9).reshape(3,3),columns=list('abc'),index=[1,2,3])
print(df1)
df2 = DataFrame(np.arange(12).reshape((4,3)),columns=list('cde'),index=[1,2,3,4])
print(df2)
print(df1+df2)
'''
   a  b  c
1  0  1  2
2  3  4  5
3  6  7  8
   c   d   e
1  0   1   2
2  3   4   5
3  6   7   8
4  9  10  11
    a   b     c   d   e
1 NaN NaN   2.0 NaN NaN
2 NaN NaN   8.0 NaN NaN
3 NaN NaN  14.0 NaN NaN
4 NaN NaN   NaN NaN NaN
'''
df1.add(df2,fill_value=0)
'''
     a    b     c     d     e
1  0.0  1.0   2.0   1.0   2.0
2  3.0  4.0   8.0   4.0   5.0
3  6.0  7.0  14.0   7.0   8.0
4  NaN  NaN   9.0  10.0  11.0
'''
  1. datafrme与series进行运算

相减为广播相减;相加时,没有就合并;除并集外用NaN填充

frame = DataFrame(np.arange(12).reshape((4,3)),columns=list('cde'),index=[1,2,3,4])
print(frame)
series = Series(range(3),index=list('def'))
print(series)
print(frame-series)
'''
   c   d   e
1  0   1   2
2  3   4   5
3  6   7   8
4  9  10  11

d    0
e    1
f    2
dtype: int64
    c     d     e   f
1 NaN   1.0   1.0 NaN
2 NaN   4.0   4.0 NaN
3 NaN   7.0   7.0 NaN
4 NaN  10.0  10.0 NaN
'''

Series

series是一组类似一维数组的对象,由一组数据以及这组数据的索引构成,索引默认从零开始递增,也可以自定义索引

#==自定义索引===
from pandas import Series,DataFrame
obj = Series(['a','b','c','d','e'],index=[1,2,3,4,5])
print(obj)
'''
1    a
2    b
3    c
4    d
5    e
dtype: object
'''

series也可以当字典用:

data = {'a':1000,'b':2000,'c':3000}
obj = Series(data)
print(obj)
keys = ['a','c']
obj1 = Series(data,index = keys)
print(obj1)
'''
a    1000
b    2000
c    3000
dtype: int64
a    1000
c    3000
dtype: int64
'''

对缺失数据的处理:缺失数据显示NaN

DataFrame

DataFrame是一个表格型数据结构,列有序,每列可以是不同值的类型,数值、字符串、布尔值都可以;dataframe有行索引和列索引;可以理解为是由series组成的一个字典;

可以接收的类型:
(1)由数组、列表、元组构成的字典
(2)二维numpy_array
(3)Series组成的字典
(4)由字典组成的字典
(5)字典或Series列表
(6)有列表或者元组组成的列表
(7)另一个dataframe

对DataFrame进行排序,默认对行排序,也可以指定轴frame.sort_index(axis=?)进行排序;或者frame.sort_values(by=‘?’)指定那个轴进行排序;

读写文件

读写csv 文件

  • pd.read_csv():默认将第一行数据作为head,若想全为数据加一个参数head=none;其他参数:
    index_col:指定索引列
    skiprows=[?]:跳过第?行
    nrows=n:读n行
  • data.to_csv():such as, data.to_csv(‘data1.csv’,sep=‘|’):将data数据写到csv文件中,以‘|’作为分隔符
  • read_fwf:读取固定宽列格式数据
  • read_clipboard:读剪切板中的数据,可以看作是read table的剪切板。在将网页中的数据转换为表格中数据时会用到

读取excel文件

pd.read_excel():参数sheet_name=''可以用来加表名

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值