数据类型
- python 的定义、赋值与变量
- 变量名的命名规则
- 三种常用的数据类型:逻辑型、数值型、字符型
逻辑型:&, |, not
数值型的运算:+, -, *, /, %, // 取整除, **乘方
浮点数的精算:(使用 decimal 包中的 Decimal)
from decimal import Decimal
a = Decimal('4.2')
b = Decimal('2.1')
(a + b) == Decimal('6.3')
字符型:
使用 \ 转义特殊字符,还可作为续行符
字符串前面加上 r 可使字符串视为原始字符:r'C:\some\name'
使用 """..."""
或 '''...'''
可跨越多行
数据结构——特定关系的集合
数据结构的学习方法:概念、定义、限制、访问、修改
pandas 包中的数据结构:Series(系列)、DataFrame(数据框)
- Series —— 存储一行或一列数据,没列名,有索引
from pandas import Series
# 定义,元素类型可混合,索引默认从0开始
x = Series(
['a', True, 1]
)
# 定义,可为 Series 指定一个名字
x = Series(
['a', True, 1],
name='test'
)
# 定义,指定索引列
x = Series(
['a', True, 1],
index = ['first', 'second', 'third']
)
# 访问,通过索引访问元素
x[1]
x['first']
# 追加,不能追加单个元素,而是一个 Series 。append 方法并不直接修改,而是返回一个新的 Series
n = Series(['2'])
x = x.append(n)
# 判断 Series 是否包含元素
# 错误:'2' in x
# series.values 的类型是 numpy.ndarray ,表示一个 array
'2' in x.values
# 获取子 Series —— 切片
# 包左不包右
x[1:3]
# 从索引中获取切片
x[[0, 2, 1]]
# 删除
# 如果有指定索引,这里不能用默认的索引:0,1,2,3……来删除了
x.drop('first')
# 如果追加了两次元素,且没有指定索引,则两次索引均从0开始,即索引重复,此时会找不到对应 index
x.drop(x.index[3])
# 返回元素值不为 '2' 的 Series,即剔除
x['2' != x.values]
- DataFrame —— 存储多行或多列,有列名(字段名),有索引(从0开始),元素的位置是[3, 2](从1开始,三行二列)。DataFrame 可以被看做成 Series 的字典
from pandas import DataFrame
# 定义
df = DataFrame({
'age': [21,22,23],
'name':['ken', 'john', 'jay']
})
df = DataFrame(
data={
'age': [21,22,23],
'name':['ken', 'john', 'jay']
},
index=['first', 'second', 'third']
)
# 访问
# 访问单列 —— 根据字段名,获取一个 Series
df['age']
# 访问多列 —— 根据字段名 list,获取一个 DataFrame
df[['age', 'name']]
# 访问行 —— 切片方式,获取一个 DataFrame
# 错误:df[1]
df[1:2]
# 访问单行 —— 索引方式,获取一个 Series
df.loc['first']
# 访问多行 —— 索引方式,获取一个 DataFrame
df.loc[['first', 'second']]
# 按行列号访问 —— 切片方式,获取一个 DataFrame,第一个切片指行,第二个切片指列
df.iloc[0:1, 0:2]
# 访问元素 —— 按行索引和列名
df.at['first', 'name']
# 行遍历
# df.iterrows() 是一个 generator
# index 是 df 的索引的值
# row 是一个 Series,df 的列名变成 row 的索引
for index, row in df.iterrows():
# 修改列名
df.columns = ['age2', 'name2']
# 修改索引
df.index = range(1, 4)
# 使原来用于索引的字段重新变成字段,而加入的索引从0,1,2,... 开始
df.reset_index()
# 删除。axis=0 为行,1为列,默认为 axis=0
df.drop('first', axis=0)
df.drop('age', axis=1)
# 增加
# 增加行(这种方式效率低,不应用于遍历中)
df.loc[len(df)] = [24, "andy"]
# 增加列
df['newColumn'] = [2,4,6,8]
向量化运算
一种特殊的并行计算方式,可在同时执行多次操作,通常是对不同数据执行同样的一个或一批指令,或者说把指令应用于一个数组 / 向量中
生成等差数列:numpy.arange(start, end, step)
# py 原生只能生成整数,读取只能 for 循环
r1_10 = range(1,11,2)
for i in r1_10:
print(i)
import numpy
# r 类型是 numpy.ndarray,即一个 array
r = numpy.arange(0.1, 0.5, 0.01)
- 向量化运算的四则运算
规则:相同位置的数据进行运算,结果保留在相同位置
原则:1. 代码中尽量避免显式的 for 循环;2. 过早的优化是魔鬼
r+r
r-r
r*r
r/r
# 函数式的向量化计算
# r的5次方
numpy.power(r,5)
# 比较运算,返回 boolean 值的向量,大小与 r 相同
r > 0.3
# 比较运算 结合 过滤 使用,根据传入的 boolean 值的向量,保留值为 True 的对应的值重新组成向量
r[r>0.3]
# 矩阵运算
# 矩阵相乘
# r 和 r 的转置相乘
numpy.dot(r, r.T)
# 效果同下
sum(r*r)
- DataFrame 的向量运算 —— 把 DataFrame 的一行或一列看成向量
# 定义
# numpy.random 用于生成随机数
# numpy.random.randn(5) 表示生成5个具有标准正态分布的值组成 array
# # numpy.random.randn(2,4) 表示生成结构为 array[array[4个元素], array[4个元素]]
df = DataFrame({
'col1':numpy.random.randn(5),
'col2':numpy.random.randn(5)
})
# 获取最小值
# axis=0 按列获取,axis=1 按行获取。默认 axis=0
# 返回一个 Series,axis=0 时索引为df 的列名,axis=1 索引为 df 的索引
# min 为计算的函数,表示取最小值
df.apply(min)
df.apply(min, axis=0)
df.apply(min, axis=1)
# 判断每一行,值是否都大于0
# numpy.all(array) 判断传进来的向量是否值都为 True
df.apply(
lambda x: numpy.all(x>0),
axis=1
)
# df.apply 用于过滤 dataFrame 的行数据
df[df.apply(
lambda x: numpy.all(x>0),
axis=1
)]