[TOC]
第四章 數(shù)據(jù)處理
課時(shí)9 數(shù)據(jù)導(dǎo)入
數(shù)據(jù)格式
- csv
- excel
- txt
pandas
csv
from pandas import read_csv
excel
- xls
- xlsx
需要提前安裝package.name = xlrd, 但是不用import
from pandas import read_excel
txt
from pandas import read_table
- 英文
- 中文
df = read_table(
filePath,
sep=',',
encoding='UTF-8',
engine='python'
)
注意代碼中的
engine='python'
課時(shí)10 數(shù)據(jù)導(dǎo)出
- to_csv
to_csv(filePath, sep=",",index=TRUE, header= TRUE)
index=false
導(dǎo)出無(wú)序號(hào)
課時(shí)11 重復(fù)值處理
- duplicated
- drop_dublicates
df = read_csv('data.csv')
#找出行重復(fù)的位置
dIndex = df.duplicated()
dIndex = df.duplicated('id')
dIndex = df.duplicated(['id', 'key'])
#刪除重復(fù)值
newDF = df.drop_duplicates()
newDF = df.drop_duplicates('id')
可以對(duì)特定列去重
課時(shí)12 缺失值處理
缺失值的產(chǎn)生原因
- 無(wú)法獲取
- 遺漏或錯(cuò)誤處理
處理方式
- 補(bǔ)齊
- 丟棄
dropna()
- 保留默赂,不處理
#找出空值的位置
isNA = df.isnull()
#獲取出空值所在的行
df[isNA.any(axis=1)]
df[isNA[['key']].any(axis=1)]
df[isNA[['key', 'value']].any(axis=1)]
df.fillna('未知')
#直接刪除空值
newDF = df.dropna()
課時(shí)13 空格值處理
- strip()
空格值處理
newName = df['name'].str.lstrip()
newName = df['name'].str.rstrip()
newName = df['name'].str.strip()
df['name'] = newName
課時(shí)14 字段抽取
- slice(start, stop)
df['tel'] = df['tel'].astype(str)
# 注意數(shù)字的字符串轉(zhuǎn)換
bands = df['tel'].str.slice(0, 3)
注意start<=x<stop
課時(shí)15 字段拆分
- split(sep,n,expand=False)
- sep 用于分割的字符串
- n 分割為多少列
- expand 是否展開(kāi)為數(shù)據(jù)框春贸,默認(rèn)=False
- True: DataFrame
- False: Series
newDF1 = df['name'].str.split(' ', 1, False)
newDF = df['name'].str.split(' ', 1, True)
newDF.columns = ['band', 'name']
課時(shí)16 記錄抽取
- dataframe[condition]
- 比較 邏輯:<, >, <=, >=, !=
- 范圍 between
- 空值匹配
- 字符匹配 patten
- 組合邏輯 ~ & |
#單條件
df[df.comments>10000]
#多條件
df[df.comments.between(1000, 10000)]
#過(guò)濾空值所在行
df[pandas.isnull(df.title)]
#根據(jù)關(guān)鍵字過(guò)濾
df[df.title.str.contains('臺(tái)電', na=False)]
#~為取反
df[~df.title.str.contains('臺(tái)電', na=False)]
#組合邏輯條件
df[(df.comments>=1000) & (df.comments<=10000)]
課時(shí)17 隨機(jī)抽樣
- DataFrame.sample(n,frac,replace=False)
- n: 個(gè)數(shù)
- frac:
- replace 是否放回抽樣,F(xiàn)alse 不可放回
#設(shè)置隨機(jī)種子
numpy.random.seed(seed=2)
#按照個(gè)數(shù)抽樣
data.sample(n=10)
#按照百分比抽樣
data.sample(frac=0.05)
#是否可放回抽樣久窟,
#replace=True,可放回,
#replace=False蔼两,不可放回
data.sample(n=10, replace=True)
#典型抽樣酝枢,分層抽樣
gbr = data.groupby("class")
gbr.groups
typicalNDict = {
1: 2,
2: 4,
3: 6
}
typicalNDict[3]
def typicalSampling(group, typicalNDict):
name = group.name
n = typicalNDict[name]
return group.sample(n=n)
result = data.groupby(
'class', group_keys=False
).apply(typicalSampling, typicalNDict)
typicalFracDict = {
1: 0.2,
2: 0.4,
3: 0.6
}
def typicalSampling(group, typicalFracDict):
name = group.name
frac = typicalFracDict[name]
return group.sample(frac=frac)
result = data.groupby(
'class', group_keys=False
).apply(typicalSampling, typicalFracDict)
課時(shí)18 合并數(shù)據(jù)
- concat
材料里面代碼有問(wèn)題,datai的col有問(wèn)題瓢剿,可能是python版本問(wèn)題
datab = pandas.concat([
data1[['id','comments']],
data2[['comments','title']],
data3[['id','title']]
])
課時(shí)19 字段合并
- + 連接字符
列的添加
新列賦值即可
課時(shí)20 字段匹配
- merge(x,y,left_on, right_on)
- 默認(rèn)內(nèi)連接
- 左連接how='left'
- 右連接how='right'
- 外連接how='outer'
#默認(rèn)只是保留連接上的部分
itemPrices = pandas.merge(
items,
prices,
left_on='id',
right_on='id'
)
#即使連接不上逢慌,也保留左邊沒(méi)連上的部分
itemPrices = pandas.merge(
items,
prices,
left_on='id',
right_on='id',
how='left'
)
#即使連接不上,也保留右邊沒(méi)連上的部分
itemPrices = pandas.merge(
items,
prices,
left_on='id',
right_on='id',
how='right'
)
#即使連接不上间狂,也保留所有沒(méi)連上的部分
itemPrices = pandas.merge(
items,
prices,
left_on='id',
right_on='id',
how='outer'
)
課時(shí)21 簡(jiǎn)單計(jì)算
- 已有字段->新字段
注意data.total并不能實(shí)現(xiàn)賦值
data['total'] = data.price*data.num
#注意攻泼,用點(diǎn)的方式,雖然可以訪(fǎng)問(wèn)鉴象,但是并沒(méi)有組合進(jìn)數(shù)據(jù)框中
data.total = data.price*data.num
課時(shí)22 數(shù)據(jù)標(biāo)準(zhǔn)化
- 去量綱
- 0-1 標(biāo)準(zhǔn)化
x^{*} = \frac{x-x_{min}}{x_{max}-x_{min}}
data['scale'] = round(
(
data.score-data.score.min()
)/(
data.score.max()-data.score.min()
)
, 2
)
# 保留兩位小數(shù)
課時(shí)23 數(shù)據(jù)分組
- 分組數(shù)據(jù)所屬區(qū)間忙菠,類(lèi)比excel的vlookup最后一個(gè)參數(shù)取值為1
cut(series, bins,right=True, labels=NULL)
# series 分組對(duì)象
# bins 所屬分組
# True 左開(kāi)右閉, False 左閉右開(kāi)纺弊;比excel方便牛欢,不用delta值
# 分組標(biāo)簽自定義
課時(shí)24 時(shí)間處理
- 字符型的時(shí)間格式數(shù)據(jù)轉(zhuǎn)換成為時(shí)間型
datetime=pandas.to_datetime(dateString, format);
# %Y year
# %m month
# %d day
# %H hour
# %M minute
# %S second
datetime.dt.property
# year, month, hour, weekday, day, hour, minute, second
# weekday: 0-6 對(duì)應(yīng)周一-周日
課時(shí)25 時(shí)間抽取
- 時(shí)間條件
- 索引
# 將dataframe的索引要設(shè)置為日期對(duì)應(yīng)的字段
DataFrame.ix[start:end]
DataFrame.ix[dates]
#注意lambda函數(shù)的使用
dateparse = lambda dates: pandas.datetime.strptime(
dates, '%Y%m%d'
)
#抽取切片
data.ix[dt1: dt2]
#取值
data.ix[[dt1,dt2]]
- 時(shí)間列
DataFrame[condition]
data[(data.date>=dt1) & (data.date<=dt2)]
課時(shí)26 虛擬變量
- 啞變量、離散特征變量淆游,用于表示分類(lèi)變量傍睹、非數(shù)量隔盛、序列因素
- 尺寸
- 顏色
- 地區(qū)
# pandas.Series.map(dict) dict中數(shù)值大小有意義
data['Education Level Map'] = data[
'Education Level'
].map(
educationLevelDict
)
# pandas.get_dummies(data, prefix=None,prefix_sep='_',dummy_na=False,columns=None,drop_first=False)
# data DataFrame對(duì)象
# prefix 列名前綴
# prefix_sep 前綴與值的分隔符
# dummy_na NA值處理方式
# columns 處理目標(biāo)列名
# drop_first 是否刪第一個(gè),建模的時(shí)候避免共線(xiàn)性使用
- 關(guān)于drop_first,是否是標(biāo)準(zhǔn)差用
$\frac{1}{n-1}$
而不是$\frac{1}{n}$
get_dummies vs map
前者分拆變量的選擇值為多列焰望,由0,1表示
后者將變量所在列映射為不同的編碼值