數(shù)據(jù)類型
- python 的定義、賦值與變量
- 變量名的命名規(guī)則
- 三種常用的數(shù)據(jù)類型:邏輯型、數(shù)值型、字符型
邏輯型:&, |, not
數(shù)值型的運(yùn)算:+, -, *, /, %, // 取整除, **乘方
浮點(diǎn)數(shù)的精算:(使用 decimal 包中的 Decimal)
from decimal import Decimal
a = Decimal('4.2')
b = Decimal('2.1')
(a + b) == Decimal('6.3')
字符型:
使用 \ 轉(zhuǎn)義特殊字符,還可作為續(xù)行符
字符串前面加上 r 可使字符串視為原始字符:r'C:\some\name'
使用 """...""" 或 '''...''' 可跨越多行
數(shù)據(jù)結(jié)構(gòu)——特定關(guān)系的集合
數(shù)據(jù)結(jié)構(gòu)的學(xué)習(xí)方法:概念、定義、限制、訪問、修改
pandas 包中的數(shù)據(jù)結(jié)構(gòu):Series(系列)、DataFrame(數(shù)據(jù)框)
- Series —— 存儲(chǔ)一行或一列數(shù)據(jù),沒列名,有索引
from pandas import Series
# 定義,元素類型可混合,索引默認(rèn)從0開始
x = Series(
['a', True, 1]
)
# 定義,可為 Series 指定一個(gè)名字
x = Series(
['a', True, 1],
name='test'
)
# 定義,指定索引列
x = Series(
['a', True, 1],
index = ['first', 'second', 'third']
)
# 訪問,通過索引訪問元素
x[1]
x['first']
# 追加,不能追加單個(gè)元素,而是一個(gè) Series 。append 方法并不直接修改,而是返回一個(gè)新的 Series
n = Series(['2'])
x = x.append(n)
# 判斷 Series 是否包含元素
# 錯(cuò)誤:'2' in x
# series.values 的類型是 numpy.ndarray ,表示一個(gè) array
'2' in x.values
# 獲取子 Series —— 切片
# 包左不包右
x[1:3]
# 從索引中獲取切片
x[[0, 2, 1]]
# 刪除
# 如果有指定索引,這里不能用默認(rèn)的索引:0,1,2,3……來刪除了
x.drop('first')
# 如果追加了兩次元素,且沒有指定索引,則兩次索引均從0開始,即索引重復(fù),此時(shí)會(huì)找不到對(duì)應(yīng) index
x.drop(x.index[3])
# 返回元素值不為 '2' 的 Series,即剔除
x['2' != x.values]
- DataFrame —— 存儲(chǔ)多行或多列,有列名(字段名),有索引(從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']
)
# 訪問
# 訪問單列 —— 根據(jù)字段名,獲取一個(gè) Series
df['age']
# 訪問多列 —— 根據(jù)字段名 list,獲取一個(gè) DataFrame
df[['age', 'name']]
# 訪問行 —— 切片方式,獲取一個(gè) DataFrame
# 錯(cuò)誤:df[1]
df[1:2]
# 訪問單行 —— 索引方式,獲取一個(gè) Series
df.loc['first']
# 訪問多行 —— 索引方式,獲取一個(gè) DataFrame
df.loc[['first', 'second']]
# 按行列號(hào)訪問 —— 切片方式,獲取一個(gè) DataFrame,第一個(gè)切片指行,第二個(gè)切片指列
df.iloc[0:1, 0:2]
# 訪問元素 —— 按行索引和列名
df.at['first', 'name']
# 行遍歷
# df.iterrows() 是一個(gè) generator
# index 是 df 的索引的值
# row 是一個(gè) 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為列,默認(rèn)為 axis=0
df.drop('first', axis=0)
df.drop('age', axis=1)
# 增加
# 增加行(這種方式效率低,不應(yīng)用于遍歷中)
df.loc[len(df)] = [24, "andy"]
# 增加列
df['newColumn'] = [2,4,6,8]
向量化運(yùn)算
一種特殊的并行計(jì)算方式,可在同時(shí)執(zhí)行多次操作,通常是對(duì)不同數(shù)據(jù)執(zhí)行同樣的一個(gè)或一批指令,或者說把指令應(yīng)用于一個(gè)數(shù)組 / 向量中
生成等差數(shù)列:numpy.arange(start, end, step)
# py 原生只能生成整數(shù),讀取只能 for 循環(huán)
r1_10 = range(1,11,2)
for i in r1_10:
print(i)
import numpy
# r 類型是 numpy.ndarray,即一個(gè) array
r = numpy.arange(0.1, 0.5, 0.01)
- 向量化運(yùn)算的四則運(yùn)算
規(guī)則:相同位置的數(shù)據(jù)進(jìn)行運(yùn)算,結(jié)果保留在相同位置
原則:1. 代碼中盡量避免顯式的 for 循環(huán);2. 過早的優(yōu)化是魔鬼
r+r
r-r
r*r
r/r
# 函數(shù)式的向量化計(jì)算
# r的5次方
numpy.power(r,5)
# 比較運(yùn)算,返回 boolean 值的向量,大小與 r 相同
r > 0.3
# 比較運(yùn)算 結(jié)合 過濾 使用,根據(jù)傳入的 boolean 值的向量,保留值為 True 的對(duì)應(yīng)的值重新組成向量
r[r>0.3]
# 矩陣運(yùn)算
# 矩陣相乘
# r 和 r 的轉(zhuǎn)置相乘
numpy.dot(r, r.T)
# 效果同下
sum(r*r)
- DataFrame 的向量運(yùn)算 —— 把 DataFrame 的一行或一列看成向量
# 定義
# numpy.random 用于生成隨機(jī)數(shù)
# numpy.random.randn(5) 表示生成5個(gè)具有標(biāo)準(zhǔn)正態(tài)分布的值組成 array
# # numpy.random.randn(2,4) 表示生成結(jié)構(gòu)為 array[array[4個(gè)元素], array[4個(gè)元素]]
df = DataFrame({
'col1':numpy.random.randn(5),
'col2':numpy.random.randn(5)
})
# 獲取最小值
# axis=0 按列獲取,axis=1 按行獲取。默認(rèn) axis=0
# 返回一個(gè) Series,axis=0 時(shí)索引為df 的列名,axis=1 索引為 df 的索引
# min 為計(jì)算的函數(shù),表示取最小值
df.apply(min)
df.apply(min, axis=0)
df.apply(min, axis=1)
# 判斷每一行,值是否都大于0
# numpy.all(array) 判斷傳進(jìn)來的向量是否值都為 True
df.apply(
lambda x: numpy.all(x>0),
axis=1
)
# df.apply 用于過濾 dataFrame 的行數(shù)據(jù)
df[df.apply(
lambda x: numpy.all(x>0),
axis=1
)]